SAS中的宏可变参数数量?

时间:2016-11-17 16:06:02

标签: sql parameters sas

我有一个宏,我目前正在传递6个表名和6列。但是,列和表的数量并不总是恒定的。

有没有办法拥有可变数量的参数?我熟悉python中的** kwargs概念。

另外,有没有办法将proc sql语句参数化为只接受提供的col和table输入?或者在SAS中尝试使用某种类型的catch来检查在运行sql语句之前是否存在变量?

这是我正在尝试参数化的宏。

%macro Generate_TP_tbl(new_tbl_name, trans_col, tbl_1, tbl_2, tbl_3, tbl_4, 
                    tbl_5, tbl_6, col_1, col_2, col_3, col_4, col_5, col_6);

proc sql;

CREATE TABLE &new_tbl_name AS 

SELECT a1._NAME_, a1.&trans_col as &col_1, a2.&trans_col as &col_2, 
       a3.&trans_col as &col_3, a4.&trans_col as &col_4, a5.&trans_col as &col_5, 
       a6.&trans_col as &col_6

FROM &tbl_1 as a1, &tbl_2 as a2, &tbl_3 as a3, &tbl_4 as a4, &tbl_5 as a5, 
     &tbl_6 as a6 

WHERE a1._NAME_ = a2._NAME_ = a3._NAME_ = a4._NAME_ = a5._NAME_ = a6._NAME_;

run;

%mend Generate_TP_table;

2 个答案:

答案 0 :(得分:3)

更常用的方法如下:

%macro mymacro /parmbuff;
  %put &SYSPBUFF;
%mend;

然后,您可以使用您喜欢的任何参数调用%mymacro,并从&SYSPBUFF自动宏变量中解析出来。

这可能比Reeza的解决方案需要更多的工作,但我认为无论如何我都会发布完整性,因为它偶尔会有用。

答案 1 :(得分:2)

将它们作为单个参数传递,并让宏稍后解析出来。

%macro (parameters = , table_list = tb1 tb2 tb3 ... tb6, col_list=col1 col2 ... col6, other_parms= ... );

我建议使用带有参数数量的do循环来构建其余的代码。这里的文档有一个关于如何提取列表中每个元素的错误示例:

http://support.sas.com/documentation/cdl/en/mcrolref/67912/HTML/default/viewer.htm#p1n2i0ewaj1zian1ria5579z1zjh.htm

SQL很难看......我想知道,如果你在一个变量上合并,数据步骤会更容易吗?然后它实际上变成了每个表的重命名,如上面的例子中的许多方面。