如何在宏中创建宏变量?

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 SYMPUTSELECT INTO 在局部符号 table 中创建一个宏变量(在 CALL SYMPUT 的情况下,如果它是非空的,但在你的宏中它是)。

有关详细信息,请参阅 How Macro Variables are Assigned and Resolved

要解决此问题,最好的办法是在 PROC SQLCALL 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;