在PROC SQL中使用日期宏变量

时间:2016-04-06 17:04:42

标签: sas

我无法让一个宏变量在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

为什么这不起作用?

3 个答案:

答案 0 :(得分:2)

这与如何使用%str()宏取消引用宏有关。试试%unquote()宏:

PROC SQL;
SELECT
   a.*
   , %unquote(&Eval_date_test) As EVAL_DATE format=date09.
FROM
   sashelp.cars a
;
quit;

http://support.sas.com/documentation/cdl/en/mcrolref/67912/HTML/default/viewer.htm#p1f5qisx8mv9ygn1dikmgba1lmmu.htm

答案 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)

您在。*

之后错过了一个逗号