2009-06-24 21 views
2

SASのProc SQLを使用すると、開いているSQL Server接続のテーブルにSASデータセットのレコードを挿入できますか?このような(動作しません):SAS Proc SQLデータベーステーブル挿入

proc sql exec; 
    connect to sqlservr as DataSrc (server=my-db-srvr database=SasProcSqlTest); 

    create table Items as select * from connection to DataSrc (
     SELECT * FROM tblItem 
    ); 

    update Items 
    set Name = Name + Name, 
     Value * 2; 

    insert into tblItem (Name, Value) 
    select Name, Value 
    from Items; 

    disconnect from DataSrc;quit;run; 
quit; 
run; 

答えて

3

私の知る限り、パススルーSQLを使用すると、データベースサーバーに制約されます。 SASドキュメントでは、データベースへのライブラリ参照を優先的に作成し、SASテーブルと同様にデータベーステーブルを処理することを推奨します。あなたの場合、これは通常のproc SQLだけを意味します。これは少なくとも最新のSASバージョンでは機能するはずですが、大きなテーブルでは最適ではありません。私たちはこれを回避するために何をやったか

  1. は、一時データベース内のテーブルを作成している - の表は、PROCを使用して、セッション固有のSASから
  2. バルクロードデータを作成したテーブルにすべきではありません追加
  3. パススルー更新を実行します
  4. テーブルをtemp dbにドロップします。

    が関連libnameをを作成するあなたは、オープン接続内でやりたいことができ
2

..

libname datasrc_lib sqlservr server=my-db-srvr database=SasProcSqlTest; 

proc sql exec; 
    connect to sqlservr as DataSrc (server=my-db-srvr database=SasProcSqlTest); 

     create table Items as select * from connection to DataSrc (
       SELECT * FROM tblItem 
     ); 

    update Items 
    set Name = Name + Name, 
     Value * 2; 

    insert into datasrc_lib.some_temp_table select * from items; 


    execute(insert into tblItem where select * from some_temp_table) by DataSrc ; 

    execute(drop table some_temp_table) by DataSrc ; 


    disconnect from DataSrc;quit;run; quit; run; 

は、上記の擬似コードはあなたにそれが動作するはずです方法のアイデアを与える必要があります。また、proc sqlに "some_temp_table"を作成するか、永続的なステージングテーブルを用意する必要があります。