我无法让一个宏变量在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
为什么这不起作用?
答案 0 :(得分:2)
这与如何使用%str()
宏取消引用宏有关。试试%unquote()
宏:
PROC SQL;
SELECT
a.*
, %unquote(&Eval_date_test) As EVAL_DATE format=date09.
FROM
sashelp.cars a
;
quit;
答案 1 :(得分:2)
你工作太辛苦了,只是把可怜的旧SAS混淆了。而不是使用宏引用只是使用正确的引号字符开头。 SAS并不关心您使用的引号字符,但单引号内的文本不会针对宏引发符进行评估,双引号内的文本也不会。因此'&eval_date'd
无法解析宏变量引用,"&eval_date"d
也无法解析。
%let Eval_Date="%sysfunc(intnx(month,%sysfunc(inputn(201603,yymmn6)),0,E),date9)"d;
答案 2 :(得分:0)
您在。*
之后错过了一个逗号