为许多参数执行SAS宏

时间:2016-06-27 11:19:44

标签: sql macros sas

我使用以下代码向表中插入行:

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是表数。

3 个答案:

答案 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;