[英]How would I include a where statement within SQL pass through code in SAS?
[英]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.