宏函数错误

Error in Macro Function

我正在使用 SAS Enterprise Guide。编写 SAS 宏函数的新手。在宏中嵌套了一个 proc sql。我试图首先检查列是否存在和 return 列号,然后使用列号获取列名,以便我可以在查询生成器中调用此宏函数。但是,我在代码的 'select cats' 部分下收到错误 180-322。下面列出的是我到目前为止编写的代码:

%macro varexist(ds,var);
%local rc dsid result dynvar;
%let dsid = %sysfunc(open(&ds));
%let result = %sysfunc(varnum(&dsid,&var));
%let rc =%sysfunc(close(&dsid));
proc sql;
    select cats('t1.',name) into :dynvar separated by ', '
    from dictionary.columns 
    where libname = 'WORK' and
          memname = 'TRANSPOSE_DATA' and 
           varnum = "&result";
quit;
&dynvar
%mend varexist;

%put %varexist(WORK.TRANSPOSE_DATA,VAR1);

您尚未编写 "MACRO FUNCTION",因为宏会发出多个语句 (proc sql; select ... quit;)。因此,如果您尝试像这样使用它:

%let myvar=%varexist(work.transpose_data,age);

那么你最终会生成如下代码:

%let myvar=proc sql;
select cats('t1.',name) ... ;
quit;

所以 select... 生成错误的原因是因为它不在 PROC SQL 步骤中,因为 PROC SQL 语句已成为 [= 分配的值14=]声明。

正如我们的评论中提到的,我更改了逻辑并使其工作如下:

%macro varexist(ta,ds,var); 
%local rc dsid result col_name; 
%let dsid = %sysfunc(open(&ds)); 
%let result = %sysfunc(varnum(&dsid,&var)); 
%let rc =%sysfunc(close(&dsid)); 
    %if &result > 0 %then %let col_name = &ta&var; 
    %else %if &ta = t1. %then %let col_name = ''; 
&col_name 
%mend varexist;