如何在SQL中使用宏? (对于每件事,都被选中)
我的意思是这样的:
&VarTable
是一个表,它有两个变量:(例如)Lib
和Table
&VarTable
中的每个观察都是表格的名称:Lib.Table
我想为每张桌子做些事情:
1)存在吗?
2)排序
和最后一个条件:
每个表(如果存在)都有一个变量&VarField
。
%macro mSortedTable(vLib,vTab,vVar);
%if %sysfunc(exist(&vLib..&vTab)) %then %do;
proc sort data = &vLib..&vTab;
by &vVar;
run;
&vLib..&vTab
%end;
%else %do; "" %end;
%mend mSortedTable;
proc sql noprint;
select %mSortedTable(vLib=Lib,vTab=Table,vVar=&VarField)
into: AccumVar separated by " "
from &VarTable;
quit;
如何使用sql和宏执行此操作?
答案 0 :(得分:2)
你必须使用sql和宏吗?一个简单的数据步骤call execute
可以满足您的需求。
下面是一个示例,它采用一个包含要处理的表列表的数据集,检查表是否存在,如果存在,则按& VarField对其进行排序。如果需要,可以通过一组自定义变量轻松扩展每个表的排序。
如果该表不存在,则会生成警告消息。
/* create fake data */
data testdat;
length lib $8 table $32;
input lib $ table $;
datalines;
work test1
work test2
work test3
work doesnotexist
;
run;
/* create 3 data sets */
data work.test1 work.test2 work.test3;
input var1 var2 var3;
datalines;
1 34 8
2 54 5
12 5 6
;
run;
/* end create data */
%let VarTable=work.testdat;
%let VarField=var2 var3;
data _null_;
set &VarTable;
dsname=catx('.',lib,table);
if exist(dsname) then do;
call execute("proc sort data=" || strip(dsname) || "; by &VarField; run;");
end;
else do;
put "WARNING: The data set does not exist: " lib= table=;
end;
run;
答案 1 :(得分:1)
调用执行是一个很好的解决方案,但是如果“执行”的数据步骤代码很复杂(在本例中不是这样),我发现很难调试。
另一种方法是将所有变量放入宏变量中,然后在宏do循环中循环它们;
(以@cmjohns数据为基础)
/* create fake data */
data testdat;
length lib $8 table $32;
input lib $ table $;
datalines;
work test1
work test2
work test3
work doesnotexist
;
run;
/* create 3 data sets */
data work.test1 work.test2 work.test3;
input var1 var2 var3;
datalines;
1 34 8
2 54 5
12 5 6
;
run;
/* end create data */
%let VarTable=work.testdat;
%let VarField=var2 var3;
proc sql noprint;
select count(lib)
into :cnt
from &vartable;
%Let cnt=&cnt;
select strip(lib), strip(table)
into :lib1 - :lib&cnt, :table1 - :table&cnt
from &vartable;
quit;
%Macro test;
%Do i = 1 %to &cnt;
%Let lib=&&lib&i;
%Let table=&&table&i;
%Let dsn=&lib..&table;
%if %sysfunc(exist(&dsn)) %then %do;
Proc sort data=&dsn;
by &varfield;
run;
%end;
%else %do;
%put WARNING: The data set does not exist: &dsn;
%end;
%end;
%Mend;
%test