2

使用 SAS 的 Proc SQL,有没有办法将 SAS 数据集中的记录插入到打开的 SQL Server 连接中的表中?像这样的东西(不起作用):

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 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 回答