【问题标题】:SAS "More positional parameters found than defined" with proc sql in a macroSAS“找到比定义更多的位置参数”在宏中使用proc sql
【发布时间】:2016-03-20 01:51:20
【问题描述】:

我遇到以下代码的错误“找到的位置参数比定义的多”:

%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”列表,而是返回该错误。我在网上查看过,似乎无法找到解决此问题的方法。例如,这个网站 (http://support.sas.com/kb/31/012.html) 建议使用 %put 或 %bquote,但两者都不起作用。非常感谢一些指导。

谢谢。

【问题讨论】:

  • 您是如何使用 %bquote 的,出了什么问题?
  • 谢谢!! Reeza 在下面使用 %bquote 提供的答案是绝对正确的。我意识到我错误地使用 %put(而不是 %let)定义了我的变量,然后在宏函数中添加了 %bquote。将 %put 更正为 %let 解决了我的问题。

标签: sql database sas


【解决方案1】:

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

%sumstats(x, y, z);

错误:尝试使用%str()

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

编辑: 您有示例 2,因此 %BQUOTE() 是正确的。

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

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

【讨论】:

  • 我希望这需要一个执行时引用函数,例如 %bquote。
  • 非常感谢 Reeza!我在上面添加了一条评论,说明为什么 %bquote 之前没有为我工作。现在是。
【解决方案2】:

不要尝试在变量名列表中使用逗号作为分隔符。这在普通 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.);

【讨论】:

  • 嗨,汤姆!以上似乎是最直接的解决方案。但是我已经尝试了您的解决方案,并且效果很好。绝对看起来这是我应该使用的最佳实践,我打算这样做。我对 translate 或 compbl 函数不太了解,所以我现在正在研究这些函数。如有任何问题,我一定会在这里写信。谢谢!
  • 知道了!我明白你在做什么。您正在获取变量并使用 compbl 对其进行压缩,以便在“x y z”之间只有 1 个空格(而不是像“x y z”这样的多个空格),然后使用 translate 函数在空格中添加逗号以使其成为“x , y, z" 在宏里面。我说对了吗?这看起来像是我将要使用的解决方案。再次感谢。
  • 是的。 COMPBL() 确保没有多个空格,因此您不会以A,,B 结尾。单引号只是为了让我不必在逗号和 translate() 调用中的空格周围使用宏引号。 TRANSLATE() 会将空格转换为逗号,将引号转换为引号。
  • 谢谢!真的很有帮助。
猜你喜欢
  • 2018-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多