2017-04-06 1 views
1

Utilisation de explicit Passage SQL, est-il possible que les tables SQL temporaires persistent entre les instructions PROC SQL? J'utilise également mon SAS 9.3 pour me connecter à un serveur SAS; donc il y a aussi RSUBMIT s. Le code ci-dessous est un exemple simple de ce qui se passe.SAS peut-il expliquer que les tables temporaires de transit persistent entre les instructions SQL PROC + RSUBMIT?

Avec ce code, les tables temporaires sont créées, mais il semble qu'après la ENDRSUBMIT la connexion se termine dans un proche avenir - mais parfois ce code si bien si je l'exécute directement, mais si j'attends ~ 10 minutes et exécuter la dernière partie, les tables temporaires sont partis.

Les tables de travail sont très grandes et les transformations sont beaucoup plus rapides avec le passage, mais prennent encore du temps. Tout moyen de rendre les tables temporaires un peu plus permanentes du côté de la base de données?

/* EXAMPLE */ 
/* upload list to db*/ 
RSUBMIT; 
PROC SQL; 
connect to odbc as db (dsn=blahdb uid=&id pwd=&pass connection=global); 
execute(load table #mylist (NUMLIST '\n') using client file 'mylist' escapes off quotes off delimited by ',') by db; 
QUIT;RUN; 
ENDRSUBMIT; 

/* Join with database tables */ 
RSUBMIT; 
PROC SQL; 
connect to odbc as db (dsn=blahdb uid=&id pwd=&pass connection=global); 

execute(select * 
    into #mylist2 
    from #mylist A 
    JOIN DBTABLE B on A.VAR = B.VAR 
) by db; 

QUIT; RUN; 
ENDRSUBMIT; 

/* download join into SAS*/ 
RSUBMIT; 
PROC SQL; 
connect to odbc as db (dsn=blahdb uid=&id pwd=&pass connection=global); 

create table akwork.sastab as select * from connection to db (select * from #mlist2); 

QUIT;RUN; 
ENDRSUBMIT; 

Les tables temporaires globales requièrent des droits d'administrateur db, est-ce correct? Je n'ai pas ça. Merci!

Répondre

0

Cela fonctionne pour Sybase en général: Si vous ajoutez un point-virgule à la fin de votre instruction SQL, la table temporaire sera persistante à travers la session active.

J'ai testé cela pour le passage SQL du SAS et il fonctionne entre différentes instructions rsubmit heures d'intervalle.

Par conséquent, utilisez ceci:

execute(select * 
    into #mylist2 
    from #mylist A 
    JOIN DBTABLE B on A.VAR = B.VAR; 
) by db; 
1

Vous devez probablement utiliser une commande LIBNAME pour établir une connexion qui peut persister entre des sessions PROC SQL indépendantes. Sans créer le fichier libref, il n'y a pas de connexion entre SAS et la base de données qui peut rester active.

C'est le moins que l'on puisse dire avec SAS/Access to Teradata.

libname tdwork teradata server=blahdb user=&id password=&pass connection=global; 
... 
proc sql; 
    connect to teradata as db (server=blahdb user=&id password=&pass connection=global); 
    ... 
quit; 
... 
proc sql; 
    connect to teradata as db (server=blahdb user=&id password=&pass connection=global); 
    ... 
quit; 
0

Dans SQL Server, vous pouvez précéder une table temporaire avec un double hachage (##) pour permettre de persister à travers les connexions (tant qu'ils sont par le même utilisateur). Assurez-vous de nettoyer après vous si ..