【发布时间】:2016-04-06 17:04:41
【问题描述】:
我无法让宏变量在 PROC SQL 中正常工作,这对我来说没有意义。
首先,如果我生成这样的查询:
PROC SQL;
SELECT
a.*
,'31MAR2016' As EVAL_DATE format=date09.
FROM
myTable a
;
它按预期工作,并在表格末尾放置一个日期字段。
那么,如果我这样做:
%Let testDate = '31MAR2016'd;
%put &testDate;
PROC SQL;
SELECT
a.*
,&testDate As EVAL_DATE format=date09.
FROM
myTable a
;
这再次正常运行,日志窗口显示以下值:
'31MAR2016'd
但是,如果我这样做:
%Let Eval_Date = %sysfunc(intnx (month,%sysfunc(inputn(201603,yymmn6.)) ,0,E),date09.);
%Let Eval_date_test = %str(%')&Eval_Date.%str(%')d;
%Put Eval_date_test;
PROC SQL;
SELECT
a.*
,&Eval_date_test As EVAL_DATE format=date09.
FROM
myTable a
;
SAS 停止运行并出现错误;
"ERROR 22-322: 语法错误,期待以下之一:名称、带引号的字符串、数字常量、日期时间常量、 缺失值,(, *, +, -, BTRIM, CALCULATED, CASE, EXISTS, INPUT, NOT, PUT, SUBSTRING, TRANSLATE, USER, ^, ~.
错误 200-322:符号无法识别,将被忽略。"
日志显示 &Eval_date_test 的值与第二个示例中的“31MAR2016”相同。请注意,为了清楚起见,我分两步创建了变量,但如果您一步创建变量,也会发生同样的事情。
以防万一,我正在运行 SAS Enterprise Guide 6.1
为什么这不起作用?
【问题讨论】:
-
为什么要使用宏引用的单引号?为什么不只使用普通的双引号?
%let Eval_Date = "%sysfunc(intnx (month,%sysfunc(inputn(201603,yymmn6.)) ,0,E),date9)"d; -
@Tom 因为我不知道单引号和双引号之间的区别。那么单引号用于宏,用于分隔字符串,而双引号在宏的上下文中仅被视为常规字符?
-
SAS 不在乎您使用哪个。但单引号内的文本不会针对宏触发器进行评估。所以
'&eval_date'不会解析宏变量引用,而"&eval_date"会。 -
@Tom 这是很棒的信息!感谢您的帮助!
标签: sas