Sas 宏函数中的错误

Sas 宏函数中的错误,sas,sas-macro,Sas,Sas Macro,我正在使用SAS企业指南。编写SAS宏函数的新手。将过程sql嵌套在宏中。我试图首先检查列是否存在并返回列号,然后使用列号获取列名,以便在查询生成器中调用此宏函数。然而,我在代码的“选择猫”部分下得到了错误180-322。下面列出了我迄今为止编写的代码: %macro varexist(ds,var); %local rc dsid result dynvar; %let dsid = %sysfunc(open(&ds)); %let result = %sysfunc(varnum(

我正在使用SAS企业指南。编写SAS宏函数的新手。将过程sql嵌套在宏中。我试图首先检查列是否存在并返回列号,然后使用列号获取列名,以便在查询生成器中调用此宏函数。然而,我在代码的“选择猫”部分下得到了错误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);
您尚未编写“宏函数”,因为宏会发出多条语句(
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
语句指定的值。

您没有编写“宏函数”,因为宏发出多个语句(
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
语句指定的值。

如我的一条评论中所述,我更改了逻辑并使其按如下方式工作:

%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;

正如在我的一篇评论中提到的,我改变了逻辑,使其工作如下:

%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;

虽然我无法解决这个问题,但我设法改变了逻辑,让新代码正常工作。我不回答这个问题,以防有人可以发布解决方案。你的程序没有编码那么有意义。如果你让它工作后,固定程序作为答案。可能需要解释一下它在做什么。%macro varexist(ta、ds、var);%本地rc dsid结果列名称;%让dsid=%sysfunc(打开(&ds));%让结果=%sysfunc(varnum(&dsid,&var));%让rc=%sysfunc(关闭(&dsid));%如果&result>0%,则%let列名称=&ta&var;%如果&ta=t1,则为%else%然后%let col_name=''&列名称%1不存在;虽然我无法解决这个问题,但我设法改变了逻辑,让新代码正常工作。我不回答这个问题,以防有人可以发布解决方案。你的程序没有编码那么有意义。如果你让它工作后,固定程序作为答案。可能需要解释一下它在做什么。%macro varexist(ta、ds、var);%本地rc dsid结果列名称;%让dsid=%sysfunc(打开(&ds));%让结果=%sysfunc(varnum(&dsid,&var));%让rc=%sysfunc(关闭(&dsid));%如果&result>0%,则%let列名称=&ta&var;%如果&ta=t1,则为%else%然后%let col_name=''&列名称%1不存在;