您如何在 SAS return 中列出包含目标值的库中所有表中的所有列?
How do you in SAS return the list of all columns in all tables in a library that contain a target value?
我正在尝试使用 SAS EG 将我在应用程序中看到的字段映射到源数据库中的列。
如果我在 Library = SomeLibrary 中搜索 'SomeString' 或 someNumericValue
我希望代码输出一个 table,其中列出包含搜索值的 tableName ColumnName。
过程SQL:
Select * 库 L 中所有 table 的 C 列包含值或字符串 = 'SomeValue'
伟大的挑战!我可以为您提供一些方法 - SASjs macro core library 的 mp_searchdata
宏将查询库(源数据库)中的所有表以获取字符串或数值。它 returns 所有列,但只会过滤匹配的记录。
要执行:
/* import library */
filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc;
/* run macro */
%mp_searchdata(lib=yourlib, string=SomeString)
这是一个很好的问题,我自己想为我开发代码..你可以尝试下面的代码从库中找到 table 名称,具有所需值的确切变量名称
修改代码
libname temp "Y:\temp\t";
data temp.aa;
a=0;
b=0;
test="String";
run;
data temp.bb;
a=1;
c=0;
d=1;
run;
data temp.cc;
a=0;
b=1;
e=1;
run;
proc sql;
create table info
as
select memname as table, name as column from dictionary.columns
where upcase(type)="NUM" /*upcase(type)="CHAR"*/
and libname='TEMP'
order by memname;
quit;
options merror mprint nosymbolgen nomlogic;
data info1;
length coltab 00.;
set info;
newtab=catx("_","TEMPT",_n_);
condition=column||"=1"; /*Set Desired value here*/
tab=("'"||table||"' as tab_name");
var=("'"||column||"' as var_name");
coltab="create table "||newtab||" as Select "||column||","||tab||","||var||" from temp."||table|| "where "||condition||";";
run;
proc sql noprint;
select count(*) into: nobs from info1;
quit;
%macro process;
%do i=1 %to &nobs;
Data _null_;
Set info1(firstobs=&i obs=&i);
call symput('query',coltab);
run;
proc sql noprint;
&Query;
quit;
%end;
%mend;
%process;
proc sql noprint;
select distinct memname into :gt separated by " " from dictionary.columns where memname like '%TEMPT%';
quit;
%macro split(var);
%let var_c=%sysfunc(countw(&var));
%do i=1 %to &var_c;
%let var_t=%sysfunc(scan(&var,&i));
proc sql noprint;
select count(*) into :cnt from &var_t;
quit;
%if &cnt=0 %then
%do;
proc datasets lib=work nolist;
delete &var_t;
quit;
run;
%end;
%end;
%mend split;
%split(>);
proc sql noprint;
select distinct memname into :gt0 separated by " " from dictionary.columns where memname like '%TEMPT%';
quit;
data all;
set >0;
keep tab_name var_name;
run;
proc sort data=all; by tab_name; run;
data final;
length vars 0.;
set all;
by tab_name;
retain vars '';
if first.tab_name then vars=var_name;
else vars=catx(",",vars,var_name);
if last.tab_name;
drop var_name;
run;
proc print data=final; run;
Proc contents
可以创建 table 个要扫描的数据集名称。可以通过 call execute
为每个数据集编写和调用扫描宏,例如 %scanner
。扫描结果、数据集名称和包含目标的列可以附加到 'all results' table.
示例:
为简单起见,假定没有数据集具有超过 10K 个目标值类型的变量——如果扫描将被剪裁,代码会发出警告。
注意:字符串目标示例为 ..., target="Jane", ...
%macro scanner (libname=, memname=, target=20500, flagMax = 10000);
%local type;
%if %qsysfunc(dequote(&target)) = %superq(target) %then
%let type = _numeric_;
%else
%let type = _character_;
data hits(keep=__libname __memname __varname);
array __flag (&flagMax) _temporary_;
set &libname..&memname;
array __candidates &type;
if dim(__candidates) = 0 then stop;
do __index = 1 to min (dim(__candidates), &flagMax);
if not __flag(__index) then
if __candidates(__index) = &target then do;
length __libname ;
length __memname __varname ;
__libname = "&libname";
__memname = "&memname";
__varname = vname(__candidates(__index));
__flag(__index) = 1;
OUTPUT;
end;
end;
if _n_ = 1 then
if dim(__candidates) > &flagMax then put "WARNING: &memname has more than &flagMax variables - scanning will be clipped. Increase flagMax=.";
run;
proc append base=hasTarget data=hits(rename=(__libname=libname __memname=memname __varname=varname));
run;
%mend;
proc sql;
create table hasTarget (libname char(8), memname char(32), varname char(32));
quit;
%let libname = SASHELP;
ods noresults;
ods output members=datasets;
proc datasets library=&libname memtype=data;
run;
quit;
ods results;
data _null_;
set datasets(keep=name memtype);
where memtype = 'DATA';
call execute (cats('%nrstr(%scanner(libname=' || "&LIBNAME., " || "memname=", name, '))'));
run;
我正在尝试使用 SAS EG 将我在应用程序中看到的字段映射到源数据库中的列。
如果我在 Library = SomeLibrary 中搜索 'SomeString' 或 someNumericValue 我希望代码输出一个 table,其中列出包含搜索值的 tableName ColumnName。
过程SQL: Select * 库 L 中所有 table 的 C 列包含值或字符串 = 'SomeValue'
伟大的挑战!我可以为您提供一些方法 - SASjs macro core library 的 mp_searchdata
宏将查询库(源数据库)中的所有表以获取字符串或数值。它 returns 所有列,但只会过滤匹配的记录。
要执行:
/* import library */
filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc;
/* run macro */
%mp_searchdata(lib=yourlib, string=SomeString)
这是一个很好的问题,我自己想为我开发代码..你可以尝试下面的代码从库中找到 table 名称,具有所需值的确切变量名称
修改代码
libname temp "Y:\temp\t";
data temp.aa;
a=0;
b=0;
test="String";
run;
data temp.bb;
a=1;
c=0;
d=1;
run;
data temp.cc;
a=0;
b=1;
e=1;
run;
proc sql;
create table info
as
select memname as table, name as column from dictionary.columns
where upcase(type)="NUM" /*upcase(type)="CHAR"*/
and libname='TEMP'
order by memname;
quit;
options merror mprint nosymbolgen nomlogic;
data info1;
length coltab 00.;
set info;
newtab=catx("_","TEMPT",_n_);
condition=column||"=1"; /*Set Desired value here*/
tab=("'"||table||"' as tab_name");
var=("'"||column||"' as var_name");
coltab="create table "||newtab||" as Select "||column||","||tab||","||var||" from temp."||table|| "where "||condition||";";
run;
proc sql noprint;
select count(*) into: nobs from info1;
quit;
%macro process;
%do i=1 %to &nobs;
Data _null_;
Set info1(firstobs=&i obs=&i);
call symput('query',coltab);
run;
proc sql noprint;
&Query;
quit;
%end;
%mend;
%process;
proc sql noprint;
select distinct memname into :gt separated by " " from dictionary.columns where memname like '%TEMPT%';
quit;
%macro split(var);
%let var_c=%sysfunc(countw(&var));
%do i=1 %to &var_c;
%let var_t=%sysfunc(scan(&var,&i));
proc sql noprint;
select count(*) into :cnt from &var_t;
quit;
%if &cnt=0 %then
%do;
proc datasets lib=work nolist;
delete &var_t;
quit;
run;
%end;
%end;
%mend split;
%split(>);
proc sql noprint;
select distinct memname into :gt0 separated by " " from dictionary.columns where memname like '%TEMPT%';
quit;
data all;
set >0;
keep tab_name var_name;
run;
proc sort data=all; by tab_name; run;
data final;
length vars 0.;
set all;
by tab_name;
retain vars '';
if first.tab_name then vars=var_name;
else vars=catx(",",vars,var_name);
if last.tab_name;
drop var_name;
run;
proc print data=final; run;
Proc contents
可以创建 table 个要扫描的数据集名称。可以通过 call execute
为每个数据集编写和调用扫描宏,例如 %scanner
。扫描结果、数据集名称和包含目标的列可以附加到 'all results' table.
示例:
为简单起见,假定没有数据集具有超过 10K 个目标值类型的变量——如果扫描将被剪裁,代码会发出警告。
注意:字符串目标示例为 ..., target="Jane", ...
%macro scanner (libname=, memname=, target=20500, flagMax = 10000);
%local type;
%if %qsysfunc(dequote(&target)) = %superq(target) %then
%let type = _numeric_;
%else
%let type = _character_;
data hits(keep=__libname __memname __varname);
array __flag (&flagMax) _temporary_;
set &libname..&memname;
array __candidates &type;
if dim(__candidates) = 0 then stop;
do __index = 1 to min (dim(__candidates), &flagMax);
if not __flag(__index) then
if __candidates(__index) = &target then do;
length __libname ;
length __memname __varname ;
__libname = "&libname";
__memname = "&memname";
__varname = vname(__candidates(__index));
__flag(__index) = 1;
OUTPUT;
end;
end;
if _n_ = 1 then
if dim(__candidates) > &flagMax then put "WARNING: &memname has more than &flagMax variables - scanning will be clipped. Increase flagMax=.";
run;
proc append base=hasTarget data=hits(rename=(__libname=libname __memname=memname __varname=varname));
run;
%mend;
proc sql;
create table hasTarget (libname char(8), memname char(32), varname char(32));
quit;
%let libname = SASHELP;
ods noresults;
ods output members=datasets;
proc datasets library=&libname memtype=data;
run;
quit;
ods results;
data _null_;
set datasets(keep=name memtype);
where memtype = 'DATA';
call execute (cats('%nrstr(%scanner(libname=' || "&LIBNAME., " || "memname=", name, '))'));
run;