我正在使用SAS Enterprise Guide。编写SAS宏函数的新手。在宏内部嵌套了一个proc sql。我正在尝试首先检查列是否存在并返回列号然后使用列号来获取列名,以便我可以在查询构建器中调用此宏函数。但是我在代码的“选择猫”部分得到了ERROR 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);
答案 0 :(得分:3)
您没有编码" 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语句已成为%LET
语句指定的值。
答案 1 :(得分:0)
正如我在评论中所提到的,我改变了逻辑,并按如下方式运作:
%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;