jueves, 1 de agosto de 2013

Diccionario de SAS: tablas dictionary.tables y dictionary.columns

En ocasiones resulta útil acudir al diccionario de SAS para obtener información
de la estructura de las tablas con las que trabajamos.
A continuación un sencillo ejemplo que accede a las tablas dictionary.tables
y dictionary.columns para obtener todas las tablas y sus columnas contenidas
en una determinada librería

/* Creamos tablas de trabajo: prueba1 y prueba2 */

data prueba1;
var1='a';var2 = 5;
run;

data prueba2;
varc = 'c';varn = 8;
run;



%macro obtener_campos(libreria);

%put Obtenemos tablas y campos de la librería &libreria;

/* Obtenemos todas las tablas contenidas en la librería, las recorremos
con una estructura de control iterativa obteniendo para cada tablas
todas sus columnas */

PROC SQL;
create table tablas as (SELECT memname
FROM dictionary.tables WHERE libname= upcase("&libreria") );
quit;

%let dsid = %sysfunc (open(tablas));    
%let nobs = %sysfunc (attrn(&dsid, NOBS));
%if &nobs > 0 %then %do;
%do i = 1 %to &nobs;     
%let rc = %sysfunc (fetch(&dsid));                                                                                                                                                                                                                                          
%let tabla = %sysfunc (getvarc(&dsid,1));  
%put Obtenemos campos tabla = &tabla;

/* Obtenemos todas las columnas y el tipo de cada una para una tabla determinada */

PROC SQL;
create table columnas as (SELECT name, type
  FROM dictionary.columns WHERE libname= "WORK" AND memtype = 'DATA' and                    memname="&tabla");
quit;

%let dsidc = %sysfunc (open(columnas));    
%let nobsc = %sysfunc (attrn(&dsidc, NOBS));
%if &nobsc > 0 %then %do;
%do j = 1 %to &nobsc;     
%let rc = %sysfunc (fetch(&dsidc));                                                                                                                                                                                                                               
%let columna = %sysfunc (getvarc(&dsidc,1));
%let tipo = %sysfunc (getvarc(&dsidc,2));
%put Nombre columna = &columna y tipo = &tipo;
%end;
%end;
%let rc = %sysfunc (close(&dsidc));

%end;
%end;
%let rc = %sysfunc (close(&dsid));

%mend;

%obtener_campos(WORK);

No hay comentarios:

Publicar un comentario