2016-07-13 2 views
0

Мне интересно, как создать макрокоманду SAS в блоке инструкции SAS% MACRO? Похоже, что мои 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

Сфера применения - ваша проблема здесь. По умолчанию CALL SYMPUT и SELECT INTO создают макрокоманду в таблице локальных символов (в случае CALL SYMPUT, если она непустая, но в вашем макросе есть).

Для получения дополнительной информации см. How Macro Variables are Assigned and Resolved.

Чтобы это исправить, лучше всего это %GLOBAL заявление в макросе перед назначением в PROC SQL или CALL SYMPUT, или использовать CALL SYMPUTX, который позволяет указать область.

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;