SAS Proc SQL INTO - 无法将宏变量写入宏?
SAS Proc SQL INTO - Cannot write a macroed variable into macro?
data COLUMN_LIST_DATA;
length COLUMN_LIST CATEGORY .;
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”效果很好。
第一个问题是如果在调用%TBL_KEEP()
之前名为MY_COLS的宏变量不存在那么宏变量将是局部的并且在宏执行时消失结束.
您可以在调用宏之前将其设置为某个默认值以确保它存在。
%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;
data COLUMN_LIST_DATA;
length COLUMN_LIST CATEGORY .;
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”效果很好。
第一个问题是如果在调用%TBL_KEEP()
之前名为MY_COLS的宏变量不存在那么宏变量将是局部的并且在宏执行时消失结束.
您可以在调用宏之前将其设置为某个默认值以确保它存在。
%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;