1

メンバーのリストを DB2 サーバーにアップロードしようとしたときにこの問題に遭遇し、問題を説明する最小限の例を作成しました。

SAS 9.2 からローカルに作成されたデータ テーブルを DB2 データ ウェアハウス (ODBC ドライバーへの接続でアクセス) のテーブルに結合するために、私の手順では、これらのローカル テーブルを同じサーバー (異なるスキーマ) に配置して、請求。これの主な目的は、アップロードされたリストに member_ID が含まれているクレームのリストを除外することです。

ローカル データの最初の行に欠損値がある場合 (メンバーが識別情報を持っていない場合もあります)、ローカル側のデータは、DB2 スキーマにアップロードされるときに欠損していない値をいくつか失います。問題を強調するために、非機密情報を含むおもちゃの例を添付しました。

PROC IMPORT OUT= WORK.druglist DATAFILE= "C:\Users\caden2\Desktop\druglist.xls" 
DBMS=EXCEL REPLACE; 
RANGE="'Tab 4# Asthma Meds$'"; 
RUN;

DATA for_clinical;
SET druglist(KEEP= Drug_Class Drug_Type Generic GPI);
IF _N_ = 4 THEN DELETE;
IF _N_ <= 10;
IF _N_ = 1 THEN DO;
    Drug_Class=''; 
    Drug_Type='';
    Generic='';
    END;
RUN;

libname clinic odbc user=XXX password=XXX dsn=DWName schema=DWSchema autocommit=yes;

PROC SQL;
DROP TABLE clinic.caden_test;
CREATE TABLE clinic.caden_test AS
    SELECT * FROM for_clinical;
QUIT;

PROC IMPORT および Data ステップは、単にデータを必要な形式にするためのものであり、問​​題はないはずです。臨床ライブラリは、私の資格情報を使用してデータ ウェアハウスへの ODBC 接続を介して作成されます。以下のスクリーンショットは、ローカル マシンと臨床サーバー上のデータ セットの前後を示しています (最初の行にいくつかの欠落があることに注意してください)。ログを投稿しませんでした。恐ろしいのは、私のログに何か問題があったという兆候がなかったことです。

ここに画像の説明を入力

これは、DB2、SAS、または SAS と DB2 の組み合わせの問題ですか? ローカルからローカルへ、または DB2 から DB2 への問題を再現できません。さらに、削除された値は常に斜めに表示されます。幅の広いデータ (4 つ以上の変数) では、ランダムな行から開始し、最後の列に到達するまで右斜め上に進みます。

Viewtable の混乱ではないというコメントの BellevueBob の懸念に対処するために、臨床データに対する PROC FREQ の出力を次に示します。欠落が実際に存在することを示しています。ここに画像の説明を入力

BellevueBobの答えは、欠落しているデータが文字の場合に機能しますが、同じ方法でデータテーブルを作成しますが、数値データでは、解決策は文字データの場合とは異なります.

4

2 に答える 2

1

NULLCHAR=NOデータ セット オプションを使用してみてください。

PROC SQL;
   DROP TABLE clinic.caden_test;
   CREATE TABLE clinic.caden_test(NULLCHAR=NO) AS
   SELECT * FROM for_clinical3;
QUIT;

ここに SAS リファレンスがあります。

DB2 をしばらく使用しておらず、ODBC を使用してテーブルを作成する方法がわかりません。ただし、テーブル インデックスと列の型を明示的に定義できる他の利用可能なデータ セット オプション、特にDBCREATE_TABLE_OPTSとも調査したいと思います。DBTYPE

編集: OPコメントに基づいて回答を修正しました。

このNULLCHAR=NOオプションは、欠損値を挿入するときに、値を NULL に設定するのではなく、単一の空白文字をデータベースに送信するように SAS に指示します。これは機能しますが、おそらく SAS の使用上の注意が必要です。

于 2013-04-19T00:41:29.080 に答える
1

私は一般的に自分の質問に答えるのが好きではありませんが、これは誰かがつまずく可能性があると考えました.

この質問とほぼ同じ文言で SAS テクニカル サポートに問い合わせたところ、次のような回答がありました。

これは、次の SAS Note に記載されているドライバーのバッファリングの問題のようです。

http://support.sas.com/kb/38/214.html

insertbuff で問題が解決する場合は、代わりに IBM Db2 ODBC ドライバーを取得する方法を確認することをお勧めします。これが問題でない場合はお知らせください。

私の元の例では、ソリューションは元の libname ステートメントにオプションを追加するのと同じくらい簡単です。それ以外の

libname clinic odbc user=XXX password=XXX dsn=DWName schema=DWSchema autocommit=yes;

新しい声明は

libname clinic odbc user=XXX password=XXX dsn=DWName schema=DWSchema insertbuff=1 autocommit=yes;

この修正は、数値データと文字データの両方に有効です。幸いなことに、これは DB2 にのみ適用されるように思われる稀なケースの問題です。

于 2013-04-23T20:55:07.223 に答える