将sas变量传递给sql传递语句

时间:2013-08-05 04:54:39

标签: sql sas

使用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而不是结果字符串。

2 个答案:

答案 0 :(得分:4)

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

您应该只需要以下内容。

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

%put EXPECTDATE1=&EXPECTDATE1.;

SASLOG:

EXPECTDATE1=2013-08-05

答案 1 :(得分:2)

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

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

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

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

那么,为什么你的代码无效?
这是因为您没有区分SAS功能和SAS宏功能。 put(Date(),YYMMDD10。)不是宏功能(很容易区分,因为它们以百分号开头。 - &gt;%&lt; - )

因此,SAS Macro不会对它进行评估,只是将代码片段放入SQL语句中。

现在有一种叫做%sysfunc函数的东西。它是一个宏函数,将执行封闭的正常函数。 因此,在设置宏变量expectdate之前,SAS宏将解析%sysfunc(Date())。 请注意,每个函数都需要由%sysfunc函数包含,即

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

话虽如此,它对某些SAS功能不起作用,而put就是其中之一。
这就是我提供解决方案的原因:使用数据步骤以任何你喜欢的方式准备它并编写结果变成了一个宏变量。