Primero...vamos a crear nuestra tabla con algunos valores y con algunos valores nulos...
Crear tabla Products |
---|
DROP TABLE Products; CREATE COLUMN TABLE Products( PRODUCT_CODE VARCHAR(3), PRODUCT_NAME NVARCHAR(20), PRICE DECIMAL(5,2) ) WITH SCHEMA FLEXIBILITY; INSERT INTO Products values ('001','Blag Stuff', 100.99); INSERT INTO Products (PRODUCT_CODE,PRODUCT_NAME,PRICE,COLOR) values ('002','More Blag Stuff',100.99,'Black'); INSERT INTO Products (PRODUCT_CODE,PRODUCT_NAME,PRICE,COLOR,TYPES) values ('003','More Blag Stuff',100.99,null,null); |
Cuando revisamos el contenido de la tabla, tendremos esto...
Como podemos ver...el último registro no tiene valores...así que deberemos obtener el nombre de los otros campos...para esto...vamos a crear una tabla para almacenarlos...luego...vamos a crear un Procedimiento para obtenerlos...
Crear tabla FIELDS_RECORDS |
---|
DROP TABLE Fields_Records; CREATE COLUMN TABLE FIELDS_RECORDS( FIELD_NAME VARCHAR(256) ); |
Para el procedimiento...vamos a leer todos los campos que componen la tabla...luego vamos a contar todos los valores que no son nulos por cada campo...para esto...vamos a utilizar la ayuda de una tabla temporal y SQL dinámico puesto que por lástima...SQLScript no soporta aún asignación de escalares...
GET_FIELDS_WITH_RECORDS |
---|
DROP PROCEDURE GET_FIELDS_WITH_RECORDS; CREATE PROCEDURE GET_FIELDS_WITH_RECORDS(IN TableName VARCHAR(256)) LANGUAGE SQLSCRIPT AS v_column_name VARCHAR(256); v_select VARCHAR(256); v_count INTEGER := 0; CURSOR c_cursor(v_column_name VARCHAR(256)) FOR SELECT COLUMN_NAME FROM SYS.CS_COLUMNS_ A inner join SYS.CS_TABLES_ B on A.table_oid = B.table_oid where schema_name = 'SYSTEM' and table_name = :TableName and internal_column_id > 200 order by internal_column_id; BEGIN FOR cur_row AS c_cursor(v_column_name) DO create local temporary table #temptable(found INTEGER); v_select := 'INSERT INTO #temptable (SELECT COUNT(' || cur_row.column_name || ') FROM ' || :TableName || ' WHERE ' || cur_row.column_name || ' IS NOT NULL)'; exec v_select; SELECT found INTO v_count FROM #temptable; IF v_count > 0 THEN v_select := 'INSERT INTO FIELDS_RECORDS VALUES(''' || cur_row.column_name || ''')'; drop table #temptable; exec v_select; END IF; END FOR; END; |
Cuando llamamos a nuestro procedimiento, simplemente debemos pasar el nombre de la tabla...y luego leet su contenido...
Llamar al procedimiento y obtner la información |
---|
CALL GET_FIELDS_WITH_RECORDS('PRODUCTS'); SELECT * FROM FIELDS_RECORDS; |
Veamos que tenemos en FIELDS_RECORDS -;)
Justo como lo esperabamos -:) Interesante, no?
Saludos,
Blag.
Developer Empowerment and Culture.
No comments:
Post a Comment