Question

À l'aide du logiciel Proc SQL de SAS, existe-t-il un moyen d'insérer des enregistrements d'un jeu de données SAS dans une table dans une connexion SQL Server ouverte? Quelque chose comme ça (qui ne marche pas):

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;
Était-ce utile?

La solution

À ma connaissance, l’utilisation de SQL direct vous contraint au serveur de base de données. La documentation SAS indique qu'il est préférable de créer une référence de bibliothèque à la base de données, puis de traiter les tables de la base de données comme des tables SAS. Dans votre cas, cela signifie simplement proc sql normale. Cela devrait fonctionner au moins dans les dernières versions SAS, mais ce n'est pas optimal pour les grandes tables.

Ce que nous avons fait pour contourner ce problème est

  1. Créer une table dans une base de données temporaire - la table ne doit pas être spécifique à la session
  2. Chargement en bloc de données de SAS vers la table créée à l'aide de proc append
  3. Effectuez la mise à jour
  4. .
  5. Supprimer la table dans la base de données temp.

Autres conseils

Vous pouvez faire ce que vous voulez dans une connexion ouverte.

créer un nom de bibliothèque associé ..

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;

Le pseudo-code ci-dessus devrait vous donner une idée de son fonctionnement. Vous devrez peut-être créer la " some_temp_table " dans le proc sql aussi bien ou avoir une table de préparation permanente disponible.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top