如何在宏中创建宏变量?

时间:2016-07-13 21:05:27

标签: sas sas-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;

提前致谢。

2 个答案:

答案 0 :(得分:2)

范围是你的问题。默认情况下,CALL SYMPUTSELECT INTO在本地符号表中创建一个宏变量(在CALL SYMPUT的情况下,如果它是非空的,但在宏中它是)。< / p>

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

要解决此问题,最好的选择是在%GLOBALPROC 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;