如何使用SAS宏解决关键字错误

时间:2017-03-20 20:43:15

标签: macros sas params-keyword

我在SAS中运行这个sql宏。

%macro calc(table=,cut=,whereclause=);
proc sql;
&table
   select 
        &cut as type format = $40. length = 40
       ,dt
       ,count(prod_nbr) as stat
       ,sum(new) as new
       ,sum(old) as old
       ,sum(retired) as retired
       ,sum(replaced) as replaced
       ,sum(final) as final
       ,sum(redo) as redo

from work.product
where retail_flg = 1
&whereclause
group by 1,2;
quit;
%mend calc;

我在程序中将宏调用了大约60次,并且当我调用它时它大约有80%的时间都可以工作。但每隔一段时间它就会产生这个错误: ERROR: All positional parameters must precede keyword parameters

如果我以相同的顺序运行代码,则错误始终显示在同一行。但是如果我开始以不同的顺序运行调用,错误最终会发生在调用宏的看似随机的代码行上。以下是其中一个调用的示例(在已创建calc表之后):

%calc(table = insert into calc, cut = 'Product', whereclause = and brand = 'JNJ' and Prod_type = 'N' and index(prod_nm, 'NEW') > 0);

由于我在宏中没有任何位置参数,我特别对错误感到困惑。我已经针对语法错误和其他常见问题进行了研究和解决,但无法解决错误。

1 个答案:

答案 0 :(得分:1)

你很可能在某处有不平衡的报价。也许你有一些价值WHERECLAUSE有不平衡的报价。我会查看生成错误消息的值之前的值。它也可能是代码被截断的结果。例如,如果要将生成的代码写入文件,则某些长WHERECLAUSE值可能会被截断并导致不平衡的引号。

在宏调用中添加一些额外的换行符可以更容易检查错误,因为较短的行更容易让人扫描。

%calc
(table = insert into calc
,cut = 'Product'
,whereclause =
  and brand = 'JNJ' and Prod_type = 'N'
  and index(prod_nm, 'NEW') > 0
);