【问题标题】:Using SQL to pass lists of values into macro variables in SAS使用 SQL 将值列表传递给 SAS 中的宏变量
【发布时间】:2019-08-26 21:04:02
【问题描述】:

我有需要处理的变量块。我将变量块名称列表放入宏变量中。然后我创建了一个宏变量列表,我想将变量列表传递到其中。我正在尝试使用此代码遍历列表,但唯一保留了一个名为 nextlist 的宏变量,用于最后一个变量块。如何获取 SQL 代码以将值列表放入我从 &blockvarlist 宏列表输入的宏中?

我在 SAS 9.4 中运行它

PROC SQL ; SELECT DISTINCT FINAL_NAME INTO :&next SEPARATED BY " " FROM 
metadata4b
                where varblockname = "&next2" and type = "Num" and 
                (index(final_name,"_NA") = 0 and index(final_name,"_1NA") 
     = 0 and index(final_name,"_2NA") = 0 ); QUIT;


%put &blocklist;
/*result of put: Q11 Q11_10N Q11_11N Q11_12N Q38_list*/
%put &blockvarlist;
/*result of put: Q11_10N_list Q11_11N_list Q11_12N_list Q38_list*/

%macro createarray;
    %global i nextblock;
        %do i = 1 %to %sysfunc(countw(&BLOCKLIST));
         %let nextblock = %scan(&BLOCKLIST, &i, %str( ));
        %let nextlist = %scan(&BLOCKVARLIST, &i, %str( ));
        PROC SQL; SELECT DISTINCT FINAL_NAME INTO :nextlist SEPARATED BY 
 " " FROM metadata4b
                where varblockname = "&nextblock" and type = "Num" and 
                (index(final_name,"_NA") = 0 and index(final_name,"_1NA") 
= 0 and index(final_name,"_2NA") = 0 ); QUIT;       
        %end;
%mend;

%createarray;

我想生成一系列可以稍后引用的宏变量。例如 Q38_list 将包含该问题块中的变量列表:Q38_CIR Q38_FRM Q38_OTR Q38_SCR

【问题讨论】:

  • 你熟悉变量快捷键吗?您可以使用 Q38: 来引用所有以 Q38 开头的变量。
  • 为什么块列表(&BLOCKLIST)有5个条目,而宏变量名列表(&BLOCKVARLIST)只有4个条目?
  • 你为什么要把变量名列表放到宏变量中?看起来您已经拥有数据集中的变量名称列表。为什么不将数据集用于您打算使用宏变量的任何目的。那么每个“块”的变量数将不受宏变量最大长度的限制。

标签: sql sas sas-macro


【解决方案1】:

我认为您可能需要在INTO 期间解析nextlist 宏变量。 您可能还需要在 SQL 之前对目标进行全球化

%let nextlist = %scan(&BLOCKVARLIST, &i, %str( ));
%global &nextlist;

改变

SELECT DISTINCT FINAL_NAME INTO :nextlist 

SELECT DISTINCT FINAL_NAME INTO :&nextlist 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多