Domanda

Utilizzando Proc SQL di SAS, c'è un modo per inserire record da un set di dati SAS in una tabella nella connessione aperta di SQL Server? Qualcosa del genere (che non funziona):

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;
È stato utile?

Soluzione

Per quanto ne so, l'uso del pass through SQL ti vincola al server di database. Il documentantion SAS afferma che è preferibile creare un riferimento di libreria al database e quindi trattare le tabelle del database proprio come le tabelle SAS. Nel tuo caso questo significa solo proc sql normale. Questo dovrebbe funzionare almeno nelle ultime versioni SAS, ma per tabelle di grandi dimensioni non è ottimale.

Quello che abbiamo fatto per aggirare questo è

  1. Crea una tabella in un database temporaneo: la tabella non deve essere specifica della sessione
  2. Carica in blocco i dati da SAS alla tabella creata, usando proc append
  3. Esegui l'aggiornamento pass-through
  4. Rilascia la tabella in temp db.

Altri suggerimenti

Puoi fare quello che vuoi all'interno di una connessione aperta ..

crea un nome utente associato ..

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;

Lo pseudo codice sopra riportato dovrebbe darti un'idea di come dovrebbe funzionare. Potrebbe essere necessario creare la " some_temp_table " anche nel proc sql o avere a disposizione una tabella di stadiazione permanente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top