2

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;
4

2 に答える 2

3

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

これを回避するために私たちが行ったことは、

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

あなたは開いた接続の中であなたが望むことをすることができます。

関連する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;

上記の擬似コードは、それがどのように機能するかについてのアイデアを与えるはずです。proc sqlにも「some_temp_table」を作成するか、永続的なステージングテーブルを使用できるようにする必要がある場合があります。

于 2009-06-29T18:23:56.217 に答える