【发布时间】:2015-11-24 20:43:18
【问题描述】:
我正在编写一个在某些时候调用一些 proc SQL 代码的宏。我希望用户能够指定任意 proc sql 选项(例如 inobs=100 可能是我的宏的输入参数之一)。
我很难引用具有相等“=”字符的参数。
其中一个问题是我还应该检查宏参数是否为空,如果不为空,则只有在sql语句中添加指定的选项。
下面是一个示例非工作测试,它不起作用并抛出
错误:关键字参数 INOBS 未使用宏定义。
我已阅读此 (http://www2.sas.com/proceedings/sugi28/011-28.pdf) 和其他 SUGI,并尝试了许多可能的方法来引用和调用宏。
如果有人可以提供以下功能的工作示例,将不胜感激。
options mprint mlogic;
data have;
length x $8;
input x;
datalines;
one
two
three
;
proc sql inobs=2;
create table sql_output as
select *
from have;
quit;
%macro pass_parameter_with_equal_sign(table=, sqlOptions=);
proc sql
%if "%left(%trim(&sqlOptions.))" ne "" %then %do;
&sqlOptions.
%end;
/* the semicolon to end the proc sql statement */
;
create table macro_output as
select *
from have;
quit;
%mend;
%pass_parameter_with_equal_sign(table=have, sqlOptions=%str(inobs=2))
title "SQL output:";
proc print data=sql_output; run;
title "Macro output:";
proc print data=macro_output; run;
【问题讨论】:
-
作为旁注...没有必要宏引用等号。 SAS 足够聪明,知道等号只是参数值的一部分。您必须引用逗号,因为它们是宏参数的分隔符。