SAS 显式传递临时表能否在 PROC SQL 语句 + RSUBMIT 之间保留?

Can SAS Explict Pass-Through Temp Tables Persist Between PROC SQL Statements + RSUBMIT?

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

我也在使用 SAS 9.3 连接到 SAS 服务器;所以还有 RSUBMITs。下面的代码是正在发生的事情的一个简单示例。

使用这段代码,创建了临时表,但在 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;

全局临时表需要数据库管理员权限,对吗?我没有那个。 谢谢!

您可能需要使用 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;

在 SQL 服务器中,您可以在临时 table 之前使用双哈希 (##) 以允许它跨连接持续存在(只要它们是由同一用户创建的) ).不过一定要自己清理一下..

这通常适用于 Sybase: 如果您在 SQL 语句末尾添加分号,则临时 table 将在整个活动会话中保持不变。

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

因此,改用这个:

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