4

SASを使用して、DBが非常に大きいため、速度を上げるためにパススルーを使用して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.);

これは機能せず、Imが取得するエラーは次のようなものです

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

したがって、日付コードを評価するのではなく、結果の文字列ではなく、実際のコードを SQL に渡します。

4

2 に答える 2

4

PUT ステートメントを %SYSFUNC で使用できないという Shorack の意見は正しいですが、PUTN を正常に使用することはできます。

次のものが必要です。

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

%put EXPECTDATE1=&EXPECTDATE1.;

サスログ:

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 マクロはそれを評価せず、文字どおりコードの一部を SQL ステートメントに挿入するだけです。

現在、%sysfunc 関数と呼ばれるものがあります。同封の通常機能を実行するマクロ機能です。したがって、%sysfunc(Date()) は、マクロ変数 expectdate を設定する前に、SAS マクロによって解決されます。各関数は %sysfunc 関数で囲む必要があることに注意してください。つまり、

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

そうは言っても、一部の SAS 関数では機能せず、put はその 1 つです。
そのため、私は上に解決策を提供しました。データステップを使用して好きな方法で準備し、結果をマクロ変数に書き込みます。

于 2013-08-05T05:53:49.937 に答える