Macros SAS宏错误:找到的位置参数多于定义的参数

Macros SAS宏错误:找到的位置参数多于定义的参数,macros,sas,Macros,Sas,鉴于以下SAS数据集和宏,请有人解释为什么前3次调用宏时没有错误,但第4次调用生成错误消息,如下所示。如果我没有在宏定义中为“code”使用默认值(将“code=A11”更改为“code”),那么所有4个调用都会无错误地执行。为什么会这样?我已尝试退出SAS会话并重新启动,但无效 SAS的新成员。非常感谢。非常感谢。:) 这是预期的行为: %sel(); /* 1st call - no parameters specified - SAS uses default va

鉴于以下SAS数据集和宏,请有人解释为什么前3次调用宏时没有错误,但第4次调用生成错误消息,如下所示。如果我没有在宏定义中为“code”使用默认值(将“code=A11”更改为“code”),那么所有4个调用都会无错误地执行。为什么会这样?我已尝试退出SAS会话并重新启动,但无效

SAS的新成员。非常感谢。非常感谢。:)


这是预期的行为:

%sel();             /* 1st call - no parameters specified - SAS uses default values from macro definition */
%sel(code=A11);     /* 2nd call - keyword parameter used correctly */
%sel(code=A12);     /* 3rd call - keyword parameter used correctly */
%sel(A11);          /* 4th call - No parameter name or =, so SAS interprets this as a positional parameter, but none are defined within the macro, hence the error*/

定义宏时,可以指定是否可以按位置调用参数(即在宏调用中不命名参数)。所谓的位置参数是在
%MACRO
语句中定义的,名称后面没有
=
。您可以定义位置参数和命名参数,但位置参数必须首先出现。请注意,可以在宏调用中按名称为任何参数指定值,但只能按位置调用定义为位置的参数

因此,如果要在宏调用中为
code
参数指定一个值而不包括名称,则需要如下定义宏:

%macro sel(code);
然后,示例中的所有调用都可以工作,但第一个调用将
code
设置为空字符串,而不是
A11
。如果要为定义为位置的参数设置默认值,则需要将逻辑添加到宏本身。例如:

%macro sel(code);
%if not %length(&code) %then %let code=A11;
proc sql;
  select * from dat5
    where Prod_Cd = "&code"
  ;
quit;
%mend;

定义宏时,参数列表指定为位置项(名称)的逗号分隔列表,后跟关键字项(名称=默认值)

调用宏时,参数(指定为逗号分隔的值列表)将映射到参数

  • 位置参数的出现顺序必须与宏定义中的顺序相同
  • 关键字参数可以在位置参数之后以任何顺序出现。
    • 位置参数也可以指定为name=value。这是一个很好的惯例,可以确保重宏代码的可读性
  • 跳过的任何位置参数都将作为空字符串传递
  • 任何未指定的关键字参数都被指定为默认值
  • 参数列表多次尝试指定参数时出错(如果不正确地混合位置和关键字或重复关键字,则会发生这种情况)

使用
A11
值作为位置参数会导致错误,因为宏
%sel
的参数列表没有任何位置参数。

删除了注释,因为我没有完全阅读?
%macro sel(code);
%if not %length(&code) %then %let code=A11;
proc sql;
  select * from dat5
    where Prod_Cd = "&code"
  ;
quit;
%mend;