我在SAS中有一个本地表,我试图在远程DB2服务器上创建一个临时表表。除了在其他地方构建一个insert语句并流式化之外,还有其他方法吗?
libname temp db2 uid=blagh pwd=blagh dsn=blagh connection=global schema=Session;
Proc SQL;
Connect to db2 (user=blagh pw=blagh dsn=blagh connection=global);
Execute (
Declare Global Temporary Table Session.Test
( foo char(10))
On Commit Preserve Rows
Not Logged
) by db2;
Execute (Commit) by db2;
Insert Into Session.Test
Select Distinct A.foo From Work.fooSource A;
我在这些主题上尝试了几种变体,每种都会导致错误。上面的代码产生。
ERROR: Column foo could not be found in the table/view identified with the correlation name A.
ERROR: Unresolved reference to table/correlation name A.
删除别名给了我。
ERROR: INSERT statement does not permit correlation with the table being inserted into.
答案 0 :(得分:1)
我不知道db2所以我不确定这是否有效,但“正常”的方法是使用PROC COPY
(尽管数据步骤也应该有效)。我猜在上面的代码中db2不允许以这种方式插入(我认为在SQL风格中不支持这种情况相当普遍)。
libname temp db2 uid=blagh pwd=blagh dsn=blagh connection=global schema=Session;
proc copy in=work out=temp;
select work.foosource;
run;
如果您需要名称不同(在PROC COPY
中它不会),您可以执行简单的数据步骤。
data temp.yourname;
set work.foosource;
run;
您不需要在SQL中执行插入操作。如果你想首先在db2中声明它(在connect to...
会话中),你可能会这样做并且仍然可以执行这些选项中的任何一个(尽管这也会因RDBMS而异,所以请测试一下)。
答案 1 :(得分:1)
如下所示的传递语句应该有效。
proc sql;
connect to db2 (user=blagh pw=blagh dsn=blagh connection=global);
execute (create view
sasdemo.tableA as
select VarA,
VarB,
VarC
from sasdemo.orders)
by db2;
execute
(grant select on
sasdemo.tableA to testuser)
by db2;
disconnect from db2;
quit;
下面的代码是我经常用来上传到DB2的代码
rsubmit YourServer;
libname temp db2 uid=blagh pwd=blagh dsn=blagh connection=global schema=Session;
data temp.Uploaded_table(bulkload = yes bl_method = cliload);
set work.SAS_Local_table;
run;
endrsubmit;
libname temp remote server=YourServer;
SAS支持提供了更多DB2选项...... http://support.sas.com/documentation/onlinedoc/91pdf/sasdoc_913/access_dbspc_9420.pdf