SAS Proc SQL INTO - 无法将宏变量写入宏?

Posted

技术标签:

【中文标题】SAS Proc SQL INTO - 无法将宏变量写入宏?【英文标题】:SAS Proc SQL INTO - Cannot write a macroed variable into macro? 【发布时间】:2022-01-17 09:34:56 【问题描述】:
data COLUMN_LIST_DATA;
length COLUMN_LIST CATEGORY $8.; 
input COLUMN_LIST CATEGORY;
datalines;
COL1 MY_COLS
COL2 OTHER
COL3 MY_COLS
COL4 OTHER
COL5 OTHER
;
run;
%macro TBL_Keep(var); %macro _; %mend _;

        PROC SQL NOPRINT;
            *Create SELECT statement for columns we want;
            SELECT COLUMN_LIST INTO: &var. SEPARATED BY ' '
            FROM COLUMN_LIST_DATA
            WHERE CATEGORY = "&var."
            ;
        QUIT;
%mend;

%TBL_Keep(MY_COLS);
%put &MY_COLS.;

不知道为什么上面的代码不起作用.... INTO 不接受宏变量作为输入吗? 如果我编写相同的代码,手动替换宏“&var”。使用“MY_COLS”可以正常工作。

【问题讨论】:

【参考方案1】:

第一个问题是 如果在调用%TBL_KEEP() 之前名为 MY_COLS 的宏变量不存在,那么宏变量将是 LOCAL 并在宏执行结束时消失

您可以在调用宏之前将其设置为某个默认值以确保它存在。

%let my_cols=BEFORE THE CALL;
%TBL_Keep(MY_COLS);
%put &=my_cols;

或者通过发出 %GLOBAL 语句使宏足够智能以强制宏变量存在。在更改宏定义时,您还应该解决第二个问题:如果没有观察结果与查询中的 WHERE 条件匹配,则宏变量的值将不会更改。

%macro TBL_Keep(var); 
%if not %symexist(&var) %then %global &var;
%let &var= ;
PROC SQL NOPRINT;
SELECT COLUMN_LIST
  INTO :&var. SEPARATED BY ' '
  FROM COLUMN_LIST_DATA
  WHERE CATEGORY = "&var."
;
QUIT;
%mend TBL_Keep;

【讨论】:

以上是关于SAS Proc SQL INTO - 无法将宏变量写入宏?的主要内容,如果未能解决你的问题,请参考以下文章

SAS PROC SQL SELECT INTO 宏创建的动态范围

Proc Sql Select Into 正在创建一个我无法调用的临时变量

Proc SQL SAS导出到CSV抛出访问错误

T:SAS/ Proc SQL - 选择进入:不在:

proc sql加入SAS中最接近日期

SAS代码错误地将宏变量的值作为输出中的新列/变量传递