SAS"找到的位置参数比定义的更多"在宏中使用proc sql

时间:2016-03-20 01:51:20

标签: sql database sas

我遇到错误"找到的位置参数多于定义的"对于以下代码:

%let my_list_of_vars = x, y, z;

%macro sumstats(my_vars);

proc sql;
    create table test2 as
    select distinct &my_vars.
    from my_dataset;
quit;

%mend sumstats;

%sumstats(&my_list_of_vars.);

我不太确定proc sql为什么不接受我的变量列表" x"," y"和" z& #34;,而是返回该错误。我已经在线查看,似乎无法找到解决此问题的方法。例如,这个网站(http://support.sas.com/kb/31/012.html)建议使用%put或%bquote,但都不起作用。非常感谢一些指导。

谢谢。

2 个答案:

答案 0 :(得分:1)

您的代码解析为以下内容,因此您需要屏蔽宏调用中的逗号。

list_of_df_to_dump = [df1,df2,...,df100]
list_of_tab_names = ['df1','df2',...,'df100']

writer = ExcelWriter(excel_name + '.xlsx')
for df, tab_name in zip(list_of_df_to_dump, list_of_tab_names):
     df.to_excel(writer, tab_name, index=False)
writer.save()

不正确:尝试使用%sumstats(x, y, z);

%str()

编辑: 你有例2,所以%BQUOTE()是正确的。

%sumstats(%str(&my_list_of_vars.));

SAS关于此问题和解决方案的说明: http://support.sas.com/kb/31/012.html

答案 1 :(得分:1)

不要尝试使用逗号作为变量名列表中的分隔符。这在普通的SAS代码中不是很有用,并且在函数调用或宏调用中尝试使用它们时会导致头痛和混乱。而是在需要时添加逗号。

%macro sumstats(my_vars);
* Normal SAS code ;
proc sort data=my_dataset(keep=&my_vars) out=test1 nodupkey;
run;

* Make version of list with commas for use in PROC SQL code ;
%local my_varsc ;
%let my_varsc = %sysfunc(compbl(&my_vars));
%let my_varsc = %sysfunc(translate(&my_varsc,',',' '));
proc sql;
  create table test2 as
    select distinct &my_varsc
    from my_dataset
  ;
quit;

%mend sumstats;

%let my_list_of_vars = x y z;
%sumstats(&my_list_of_vars.);