宏函数错误
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;
我正在使用 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;