Macros SAS宏错误:找到的位置参数多于定义的参数
鉴于以下SAS数据集和宏,请有人解释为什么前3次调用宏时没有错误,但第4次调用生成错误消息,如下所示。如果我没有在宏定义中为“code”使用默认值(将“code=A11”更改为“code”),那么所有4个调用都会无错误地执行。为什么会这样?我已尝试退出SAS会话并重新启动,但无效 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
这是预期的行为:
%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;