将SAS变量传递到SQL Pass Through语句

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

2个回答

4
Shorack说PUT语句不能与%SYSFUNC一起使用,但可以成功使用PUTN。你只需要如下操作。
%LET EXPECTDATE1 = %SYSFUNC(PUTN(%SYSFUNC(DATE()),YYMMDD10.));

%put EXPECTDATE1=&EXPECTDATE1.;

SASLOG:

EXPECTDATE1=2013-08-05

1
这就是我喜欢SAS的原因。无论我认为自己知道多少,总有一些我不知道的东西。 - user2337871
嗯,还是不行。 日志显示 EXPECTDATE1=2013-08-06 但是它没有返回任何结果,如果我写 %let expectdate1 = '2013-08-06'; 那么它就可以正常工作。 - user185955
因为如果需要引用,你需要在宏变量中添加引号。例如:%LET EXPECTDATE1 = %str(%')'%SYSFUNC(PUTN(%SYSFUNC(DATE()),YYMMDD10.))%str(%'); - mvherweg
%LET EXPECTDATE1 = %bquote('%SYSFUNC(PUTN(%SYSFUNC(DATE()),YYMMDD10.))'); %put EXPECTDATE1=&EXPECTDATE1.; %LET EXPECTDATE1 = %bquote('%SYSFUNC(PUTN(%SYSFUNC(DATE()),YYMMDD10.))'); %put EXPECTDATE1=&EXPECTDATE1.; - user2337871
你能确认一下你是否在像我原来的帖子中那样进行透传场景测试吗?因为当不处于透传状态时,它可以正常工作。 - user185955

2

注意:因为需要单引号,已对文本进行编辑。

首先提供一个可行的解决方案,然后解释为什么你的方法行不通。 请改用以下代码:

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

上面的代码将创建您的字符串,然后将其放入expectdate1宏变量中。
那么,为什么您的代码无法正常工作呢? 因为您没有区分SAS函数和SAS宏函数。 put(Date(),YYMMDD10.)不是宏函数(容易区分,因为它们以百分号开头。->%<-)。
因此,SAS宏不会评估它,只是将代码片段直接放入您的SQL语句中。
现在有一个名为%sysfunc函数的东西。它是一个宏函数,将执行括号内的普通函数。 因此,在设置宏变量expectdate之前,%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函数。
这就是为什么我在顶部提供了解决方案:使用数据步骤以任何你喜欢的方式准备它,并将结果写入宏变量。


代码无法运行,日志仍然显示WHERE CAPTURE_DT >= '2013-08-05' and CAPTURE_DT <= &expectdate1并且没有返回结果。 - user185955
更新答案以反映您需要单引号。我不知道为什么它不能解决。在全新的会话中,它可以正常工作。将日志记录更详细可能有助于弄清发生了什么。(symbolgen mprint mprintnest mlogic mlogicnest) - mvherweg
你能确认一下你是否在像我原来的帖子中那样进行透传测试吗?因为当不进行透传时,它可以正常工作。 - user185955
好的,现在它可以工作了,谢谢!额外的调试有所帮助。它显示正在发送 &expectdate1。但随后解释说已将其解析为正确的值。 - user185955

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接