Sas 如何在宏中创建宏变量?

Sas 如何在宏中创建宏变量?,sas,sas-macro,Sas,Sas Macro,我想知道如何在SAS%宏语句块中创建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 PASSW

我想知道如何在SAS%宏语句块中创建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;

提前感谢。

范围是您的问题。默认情况下,
CALL SYMPUT
SELECT INTO
在本地符号表中创建一个宏变量(对于
CALL SYMPUT
,如果它是非空的,但在宏中却是空的)

有关更多信息,请参阅


要解决此问题,最好在
PROC SQL
CALL-SYMPUT
中赋值之前,在宏中使用
%GLOBAL
语句,或者使用
CALL-SYMPUTX
来指定范围。

范围是您的问题。默认情况下,
CALL SYMPUT
SELECT INTO
在本地符号表中创建一个宏变量(对于
CALL SYMPUT
,如果它是非空的,但在宏中却是空的)

有关更多信息,请参阅


要解决此问题,最好在
PROC SQL
CALL SYMPUT
中赋值之前在宏中使用
%GLOBAL
语句,或者使用
CALL SYMPUTX
来指定范围。

您正在创建宏变量,但宏在退出之前从未使用过它

您是否希望宏变量在宏结束后可用?如果是这样,您需要先创建它

%let DT_FMT_CHECK_george= ;
%NONDATE_FORMAT_CHECK(varname=george,output=fred);
或者在为其赋值之前将其设置为全局

%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;

您正在创建宏变量,但宏在退出之前从未使用过它

您是否希望宏变量在宏结束后可用?如果是这样,您需要先创建它

%let DT_FMT_CHECK_george= ;
%NONDATE_FORMAT_CHECK(varname=george,output=fred);
或者在为其赋值之前将其设置为全局

%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;