SAS可以在PROC SQL语句+ RSUBMIT之间持续显示传递临时表吗?

时间:2017-04-06 03:49:28

标签: sql sas temp-tables

使用显式 SQL传递,临时SQL表是否可以在PROC SQL语句之间保留?

我也使用SAS 9.3连接到SAS服务器;所以还有RSUBMIT个。下面的代码是一个简单的例子。

使用此代码创建临时表,但看起来在ENDRSUBMIT连接在不久的将来某个时间终止之后 - 但是有时这个代码如果直接运行它就好了,但是如果我等了大约10分钟并执行了后面的部分,临时表就不见了。

工作台非常大,转换速度快得多,但仍需要时间。有什么方法可以使临时表在数据库端更加永久化?

/* 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;

全局临时表需要数据库管理员权限,对吗?我不知道。 谢谢!

3 个答案:

答案 0 :(得分:1)

您可能需要使用LIBNAME命令建立可在独立PROC SQL会话之间保持的连接。如果没有创建libref,SAS和数据库之间就没有连接可以保持活动状态。

至少它与SAS / Access 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;

答案 1 :(得分:0)

在SQL Server中,您可以在临时表之前使用双哈希(##),以允许它跨连接持久存在(只要它们是由同一个用户)。一定要自己清理一下......

答案 2 :(得分:0)

这适用于Sybase: 如果在SQL语句的末尾添加分号,则临时表将通过活动会话保持不变。

我已经针对SAS的SQL传递对此进行了测试,它可以在相隔几小时的不同rsubmit语句之间工作。

因此,请改用:

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