簡體   English   中英

將SAS變量傳遞到SQL傳遞語句

[英]Passing sas variable into a sql pass through statement

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

Shorack是正確的,PUT語句不能與%SYSFUNC一起使用,但是您可以成功使用PUTN。

您只需要以下內容。

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

%put EXPECTDATE1=&EXPECTDATE1.;

SASLOG:

EXPECTDATE1=2013-08-05

注意:已編輯為所需的單引號。

首先讓我提供一個可行的解決方案,然后解釋為什么您的方法不起作用。 使用這段代碼代替:

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

上面的代碼將創建您的字符串,然后將其放入Expectdate1宏變量中。

那么,為什么您的代碼不起作用?
這是因為您沒有區分SAS功能和SAS宏功能。 put(Date(),YYMMDD10。)不是宏函數(易於區分,因為它們以百分比符號開頭。->%<-)

因此,SAS Macro不會評估它,而只是將代碼片段按字面意義放入您的SQL語句中。

現在有一個叫做%sysfunc函數的東西。 它是一個宏功能,將執行附帶的常規功能。 因此,%sysfunc(Date())將在設置宏變量Expectate之前由SAS宏解析。 請注意,每個函數都必須由%sysfunc函數括起來,即

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

話雖如此,它不適用於某些SAS功能,而put是其中之一。
這就是為什么我在上面提供解決方案的原因:使用數據步驟以您喜歡的任何方式准備它並將結果寫入宏變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM