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 服务器;所以还有 RSUBMIT
s。下面的代码是正在发生的事情的一个简单示例。
使用这段代码,创建了临时表,但在 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;
使用 explicit SQL 传递,临时 SQL 表是否可以在 PROC SQL
语句之间保留?
我也在使用 SAS 9.3 连接到 SAS 服务器;所以还有 RSUBMIT
s。下面的代码是正在发生的事情的一个简单示例。
使用这段代码,创建了临时表,但在 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;