4

使用 SAS,我使用传递速度从 SQL 数据库中提取数据,因为数据库非常大。下面的代码按预期工作。

%let expectdate1 = '2013-07-03';*/

proc sql;

connect to ***** as abc (tdpid=***** user='****' password='*****' );
create table Searched_data as
select * from connection to dss(

SELECT  *
FROM  database.tablename
WHERE CAPTURE_DT >= '2013-07-01' and CAPTURE_DT <= &expectdate1

);
disconnect from abc;
quit;

当我想要对 expectate1 进行参数化时,就会出现问题。

所以我替换

%let expectdate1 = '2013-07-03';*/

%let expectdate1 = put(Date(),YYMMDD10.);

这不起作用,我得到的错误类似于

....WHERE CAPTURE_DT >= '2013-07-01' and CAPTURE_DT <= put(Date(),YYMMDD10) .....

所以它不评估我的日期代码,而是将实际代码传递给 SQL,而不是结果字符串。

4

2 回答 2

4

Shorack 认为 PUT 语句不能与 %SYSFUNC 一起使用是正确的,但是您可以成功使用 PUTN。

您应该只需要以下内容。

%LET EXPECTDATE1 = %SYSFUNC(PUTN(%SYSFUNC(DATE()),YYMMDD10.));

%put EXPECTDATE1=&EXPECTDATE1.;

SASLOG:

EXPECTDATE1=2013-08-05
于 2013-08-05T06:55:42.373 回答
2

注意:为您需要的单引号进行了编辑。

让我首先提供一个可行的解决方案,然后解释为什么您的方法不起作用。请改用这段代码:

data _NULL_;
    call symput("expectdate1",cats("'",put(Date(),YYMMDD10.)),"'");
run;

上面的代码将创建您的字符串,然后将其放入 expectdate1 宏变量中。

那么,为什么您的代码不起作用?
那是因为您没有区分 SAS 函数和 SAS 宏函数。put(Date(),YYMMDD10.) 不是宏函数(很容易区分,因为它们以百分号开头。-> % <-)

所以 SAS Macro 不会对其进行评估,而只是将这段代码放入您的 SQL 语句中,从字面上看。

现在有一个叫做 %sysfunc 函数的东西。它是一个宏功能,将执行封闭的正常功能。所以 %sysfunc(Date()) 将在设置宏变量期望日期之前由 SAS 宏解析。请注意,每个函数都需要用 %sysfunc 函数括起来,即

%let someVariable = %sysfunc(mean(max(1,3),5)); /*WRONG*/
%let someVariable = %sysfunc(mean(%sysfunc(max(1,3)),5)); /*RIGHT*/

话虽如此,它不适用于某些 SAS 功能,而 put 就是其中之一。
这就是为什么我在上面提供解决方案的原因:使用数据步骤以任何您喜欢的方式准备它并将结果写入宏变量。

于 2013-08-05T05:53:49.937 回答