我使用以下代码向表中插入行:
proc sql;
create table business_keys as
select name, memname
from sashelp.vcolumn
where 1=0;
quit;
%macro insert(list);
proc sql;
%do i=1 %to &max;
%let val = %scan(&list,&i);
insert into business_keys
select distinct name, memname
from sashelp.vcolumn
where upcase(memname) = "&list"
and upcase(name) like '%_ZRODLO_ID%'
and length(name) = 12;
%end;
quit;
%mend;
%insert(&name1);
现在它将同一行插入&max
次。
我必须为所有宏变量(& name#)执行它,而不仅仅是&name1
。 如何同时传递所有变量?原则上,我想循环遍历所有这些表名:
%insert(&name1-&name&max)
%name1 = PEOPLE,%name2 = CREDITS,...%name%max = ANY_TABLE_NAME
其中& name#是表名,& max是表数。
答案 0 :(得分:2)
%macro insert;
proc sql;
%do i=1 %to &max;
insert into business_keys
select distinct name, memname
from sashelp.vcolumn
where upcase(memname) = upcase("&&name&i") and upcase(name) like '%_ZRODLO_ID%' and length(name) = 12;
%end;
quit;
%mend;
%insert;
&& name& i解析为& name1 \& name2 ... \& namex,根据i解析为PEOPLE \ CREDITS ... \ ANY_TABLE_NAME。
答案 1 :(得分:2)
听起来你想传递一个"宏数组"到您的宏进行处理。哪里有"宏阵列"我指的是一系列宏变量,它们都包含基本名称和数字后缀。像NAME1,NAME2等。通过将两个参数传递给宏来更容易。一个用于数组的基本名称,一个用于上限(或最大)索引。
%macro insert(basename,max);
%local i;
...
%do i=1 %to &max ;
... &&basename&i ...
%end;
...
%mend insert;
所以你可以像这样调用宏:
%let name1=PEOPLE;
%let name2=CREDITS;
%insert(NAME,2);
我个人会避免使用宏数组,而是将列表存储在一个宏变量中。如果列表只是SAS名称(数据集,库,变量,格式等),那么只需使用空格作为分隔符。如果它类似于可能包含空格的标签,则使用其他字符(如|
作为分隔符)。然后你的宏看起来会更像这样。
%macro insert(memlist);
%local i;
...
%do i=1 %to %sysfunc(countw(&memlist,%str( ))) ;
... %scan(&memlist,&i,%str( )) ...
%end;
...
%mend insert;
所以你可以像这样调用宏:
%insert(PEOPLE CREDITS);
答案 2 :(得分:1)
如果列表看起来像 PEOPLE,CREDITS,...,ANY_TABLE_NAME 您应该将 max 变量定义如下:
%let max = %sysfunc(countw(&list,',')).
您将知道迭代次数。
%macro insert(list);
%let max = %sysfunc(countw(&list,',')).
proc sql;
%do i=1 %to &max;
%let val = %scan(&list,&i);
insert into business_keys
select distinct name, memname
from sashelp.vcolumn
where upcase(memname) = "&val" and upcase(name) like '%_ZRODLO_ID%' and length(name) = 12;
%end;
quit;
%mend;