我想知道如何在SAS%MACRO语句块中创建SAS宏变量?看来我的CALL SYMPUT或我的SELECT INTO语句在%MACRO语句块中不起作用。
%MACRO NONDATE_FORMAT_CHECK(varname=,output=);
PROC SQL;
CONNECT TO NETEZZA AS NET
(SERVER=&server
DATABASE=&database
USER=&NBKID
PASSWORD=&NBKPASSWD);
CREATE TABLE WORK.DT_FMT&output AS SELECT *
FROM CONNECTION TO NET
(SELECT 'FORMAT_IS_DATE' AS DT_FMT_INDICATOR
FROM &input_database&input_table
WHERE (SELECT COUNT(*)
FROM &input_database&input_table
WHERE SUBSTR(&varname,1,10) LIKE '____-__-__') > 0
LIMIT 1);
DISCONNECT FROM NET;
QUIT;
PROC SQL;
SELECT DT_FMT_INDICATOR INTO :DT_FMT_CHECK_&varname
FROM WORK.DT_FMT&output;
QUIT;
%MEND NONDATE_FORMAT_CHECK;
提前致谢。
答案 0 :(得分:2)
范围是你的问题。默认情况下,CALL SYMPUT
和SELECT INTO
在本地符号表中创建一个宏变量(在CALL SYMPUT
的情况下,如果它是非空的,但在宏中它是)。< / p>
有关详细信息,请参阅How Macro Variables are Assigned and Resolved。
要解决此问题,最好的选择是在%GLOBAL
或PROC SQL
中分配之前在您的宏中使用CALL SYMPUT
语句,或使用CALL SYMPUTX
来指定范围。
答案 1 :(得分:0)
您正在创建宏变量,但您的宏在退出之前从不使用它。
您是否打算在宏结束后使宏变量可用?如果是这样,你需要先创建它
%let DT_FMT_CHECK_george= ;
%NONDATE_FORMAT_CHECK(varname=george,output=fred);
或在为其分配值之前将其设为GLOBAL
。
%if not %symexist(DT_FMT_CHECK_&varname) %then %global DT_FMT_CHECK_&varname;
PROC SQL;
SELECT DT_FMT_INDICATOR INTO :DT_FMT_CHECK_&varname
FROM WORK.DT_FMT&output;
QUIT;