如何在宏中创建宏变量?
How to create a macro variable within a macro?
我想知道如何在 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;
提前致谢。
Scope 是您的问题。默认情况下,CALL SYMPUT
和 SELECT INTO
在局部符号 table 中创建一个宏变量(在 CALL SYMPUT
的情况下,如果它是非空的,但在你的宏中它是)。
有关详细信息,请参阅 How Macro Variables are Assigned and Resolved。
要解决此问题,最好的办法是在 PROC SQL
或 CALL SYMPUT
中赋值之前在宏中使用 %GLOBAL
语句,或者使用 CALL SYMPUTX
来让您指定范围。
您正在创建宏变量,但您的宏在退出之前从未使用过它。
您是否打算在宏结束后使用宏变量?如果是这样,您需要先创建它
%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;
我想知道如何在 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;
提前致谢。
Scope 是您的问题。默认情况下,CALL SYMPUT
和 SELECT INTO
在局部符号 table 中创建一个宏变量(在 CALL SYMPUT
的情况下,如果它是非空的,但在你的宏中它是)。
有关详细信息,请参阅 How Macro Variables are Assigned and Resolved。
要解决此问题,最好的办法是在 PROC SQL
或 CALL SYMPUT
中赋值之前在宏中使用 %GLOBAL
语句,或者使用 CALL SYMPUTX
来让您指定范围。
您正在创建宏变量,但您的宏在退出之前从未使用过它。
您是否打算在宏结束后使用宏变量?如果是这样,您需要先创建它
%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;