2016-07-13 13 views
0

私は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

範囲はあなたの問題です。既定では、CALL SYMPUTSELECT INTOはローカルシンボルテーブルにマクロ変数を作成します(CALL SYMPUTの場合は空ではありませんがマクロではあります)。

詳細については、How Macro Variables are Assigned and Resolvedを参照してください。

は、この問題を解決するには、あなたの最善の策は、PROC SQLまたはCALL SYMPUTにおける先行割り当てのマクロで%GLOBALのステートメントであるか、範囲を指定することができます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; 
関連する問題