Pregunta

Utilizando Proc SQL de SAS, ¿hay alguna forma de insertar registros de un conjunto de datos SAS en una tabla en la conexión abierta de SQL Server? Algo como esto (que no funciona):

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;
¿Fue útil?

Solución

Que yo sepa, el uso de pasar a través de SQL lo limita al servidor de la base de datos. La documentación de SAS dice que es preferible crear una referencia de biblioteca a la base de datos y luego tratar las tablas de la base de datos como tablas de SAS. En su caso, esto significa simplemente proc sql normal. Esto debería funcionar al menos en las últimas versiones de SAS, pero para tablas grandes no es óptimo.

Lo que hemos hecho para evitar esto es

  1. Crear una tabla en una base de datos temporal: la tabla no debe ser específica de la sesión
  2. Datos de carga masiva desde SAS a la tabla creada, usando proc append
  3. Hacer la actualización de paso
  4. Suelta la tabla en temp db.

Otros consejos

Puedes hacer lo que quieras dentro de una conexión abierta ...

crea un libname asociado ..

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;

El pseudo código anterior debería darle una idea de cómo debería funcionar. Es posible que necesite crear la tabla "some_temp_table" en el proc sql también o tenga una tabla de etapas permanente disponible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top