0

私は SAS を初めて使用し、最近 SAS データセットの一部を SQL Server テーブルに移行しましたが、分析にはまだ SAS を使用しています。SAS が SQL Server テーブルからデータを取り込もうとしていて、srv_edt の日付が dos_beg_dt1 と dos_end_dt1 の SAS 日付の間にあるかどうかを SAS にチェックさせようとすると、問題が発生しました。

SAS が日付を比較しようとすると、次のエラーが表示されます: エラー: WHERE 句の演算子には互換性のある変数が必要です。

dos_beg_dt1、dos_end_dt1、および srv_edt (SQL 日付形式) はすべて、yyyy-mm-dd の形式で「表示」されます。srv_edt を SAS テーブルに取り込むと、文字の日付として読み取られます。だから私は日付の形式を変更しようとしましたが、次のようなエラーが表示されます: エラー: 変数 srv_edt は文字と数値の両方として定義されています。srv_edt (SQL) が dos_beg_dt1 と dos_end_dt1 の SAS 日付の間にあるかどうかを確認するために SAS に比較を行わせるための正しい形式または関数が見つからないようです。

私が使用するコードは次のとおりです。

libname sql odbc dsn=test schema=dbo;

%let dos_beg_dt1 = %sysfunc(intnx(qtr,&date,-1,beginning),yymmdd10.);
%let dos_end_dt1 = %sysfunc(intnx(qtr,&date,-1,end),yymmdd10.);

data sample;
set sql.table;
where &dos_beg_dt1 <= srv_edt <= &dos_end_dt1;
run;

参考までに、SAS 9.2 を使用して odbc 経由で SQL Server 2008 に接続しています。

ヘルプやアドバイスをいただければ幸いです。

4

3 に答える 3

0

SQL Server は、SQL Server 2008 で新しい日付型と日時型を導入しました (以前は、すべての日付/日時変数に対して 1 つの型しかありませんでした)。 この使用上の注意では、日付変数を正しく読み取るために、SAS 用の新しい SQL Server ODBC ドライバーのセットをインストールする必要があることを示唆しています。ODBC 接続を実行しているマシンに SQL Server 2008 ツール (SQL Server Management Studio など) がある場合、これは正常にインストールされることを示唆していますが、複数のドライバーがインストールされている可能性があり、正しいドライバーを使用していることを確認する必要があります。

そうは言っても、パススルー SQL を使用してデータをプルすることは悪い考えではありません。これにより、プルが容易になる可能性があります (ODBC ドライバーについてそれほど心配する必要がないため)。一般化されたパススルー接続文字列は次のとおりです。

proc sql;
   connect to odbc (required="driver=sql server native client 10.0;
Server=server;Trusted_Connection=Yes;DATABASE=database;");
  create table X as select * from connection to odbc(... sql server native code here ...);
quit;

あなたの質問から、あなたは SQL の人であり、自分でクエリを作成できるように思えます。そうでない場合は、質問を編集してその要求を含めます (その後、SQL Server 担当者または私が回答します)。SASマクロ変数またはクエリを一重引用符で囲まない限り、そのクエリでSASマクロ変数を使用できます(現在の日付を渡すなど)。

于 2013-05-24T14:06:36.093 に答える
0

srv_edtが SAS データセットに文字変数として表示されている場合、それは実際には文字変数であるか、使用している ODBC ドライバーによって文字に変換されていることを意味します (おそらくネイティブのデータ型が ODBC でサポートされていないため) )。

可能であれば、これを PROC SQL パススルー クエリに変更することをお勧めします。SAS 関数に対応するネイティブ構文を理解する必要がありintnxます (そして、私はそれをお手伝いすることはできません)。書かれているように、テーブル全体を読み取る必要があります (SAS 関数を使用しているため)。パススルー クエリを使用すると、SAS は whie 句に一致する行のみを受け取ります。

この動作を制御する ODBC ドライバーの設定がある場合があります。ODBC および SQL Server タグを質問に追加します。より多くの「ヒット」を得ることができます。

于 2013-05-23T23:42:03.423 に答える