【问题标题】:Error in Macro Function宏功能错误
【发布时间】:2016-02-10 22:36:40
【问题描述】:

我正在使用 SAS Enterprise Guide。编写 SAS 宏函数的新手。在宏中嵌套了一个 proc 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);

【问题讨论】:

  • 虽然我无法解决问题,但我设法更改逻辑并让新代码正常工作。我不回答这个问题,以防有人可以发布解决方案
  • 您的程序在编码时没有多大意义。如果你让它工作发布固定程序作为答案。也许可以解释它在做什么。
  • %macro varexist(ta,ds,var); %local rc dsid 结果 col_name; %let dsid = %sysfunc(open(&ds)); %let 结果 = %sysfunc(varnum(&dsid,&var)); %let rc =%sysfunc(close(&dsid)); %if &result > 0 %then %let col_name = &ta&var; %否则 %如果 &ta = t1。 %then %let col_name = ''; &col_name %mend varexist;

标签: sas sas-macro


【解决方案1】:

您没有编写“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 语句分配的值。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-13
      • 2011-12-29
      • 2011-11-15
      • 1970-01-01
      相关资源
      最近更新 更多