質問

SASのProc SQLを使用して、開いているSQL Server接続のテーブルにSASデータセットからレコードを挿入する方法はありますか?次のようなもの(機能しません):

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;
役に立ちましたか?

解決

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

これを回避するために行ったのは

  1. 一時データベースにテーブルを作成します-テーブルはセッション固有であってはなりません
  2. proc appendを使用して、SASから作成されたテーブルにデータを一括読み込み
  3. パススルー更新を行う
  4. 一時データベースにテーブルをドロップします。

他のヒント

開いている接続内で必要なことを実行できます。

関連するlibnameを作成します。

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;

上記の擬似コードは、それがどのように機能するかについてのアイデアを提供するはずです。 " some_temp_table"を作成する必要があるかもしれません。 proc sqlでも、または利用可能な永続的なステージングテーブルがあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top