如何使用 SAS 宏解决关键字错误
How to Resolve Keyword Error with SAS Macro
我运行在 SAS 中使用这个 sql 宏。
%macro calc(table=,cut=,whereclause=);
proc sql;
&table
select
&cut as type format = . 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 table 之后):
%calc(table = insert into calc, cut = 'Product', whereclause = and brand = 'JNJ' and Prod_type = 'N' and index(prod_nm, 'NEW') > 0);
我对这个错误感到特别困惑,因为我在宏中没有任何位置参数。我已经研究过语法错误和其他常见问题,但无法解决错误。
很可能你在某处有不平衡的引号。 WHERECLAUSE 的引号不平衡,也许您有一些价值。我会查看生成错误消息的值之前的值。它也可能是代码被截断的结果。例如,如果您将生成的代码写入文件,一些长的 WHERECLAUSE 值可能会被截断并导致不平衡的引号。
在您的宏调用中添加一些额外的换行符可以更容易地检查错误,因为较短的行更容易被人类扫描。
%calc
(table = insert into calc
,cut = 'Product'
,whereclause =
and brand = 'JNJ' and Prod_type = 'N'
and index(prod_nm, 'NEW') > 0
);
我运行在 SAS 中使用这个 sql 宏。
%macro calc(table=,cut=,whereclause=);
proc sql;
&table
select
&cut as type format = . 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 table 之后):
%calc(table = insert into calc, cut = 'Product', whereclause = and brand = 'JNJ' and Prod_type = 'N' and index(prod_nm, 'NEW') > 0);
我对这个错误感到特别困惑,因为我在宏中没有任何位置参数。我已经研究过语法错误和其他常见问题,但无法解决错误。
很可能你在某处有不平衡的引号。 WHERECLAUSE 的引号不平衡,也许您有一些价值。我会查看生成错误消息的值之前的值。它也可能是代码被截断的结果。例如,如果您将生成的代码写入文件,一些长的 WHERECLAUSE 值可能会被截断并导致不平衡的引号。
在您的宏调用中添加一些额外的换行符可以更容易地检查错误,因为较短的行更容易被人类扫描。
%calc
(table = insert into calc
,cut = 'Product'
,whereclause =
and brand = 'JNJ' and Prod_type = 'N'
and index(prod_nm, 'NEW') > 0
);