为了给出背景,我正在使用 - 大型机中的基础SAS(由JCL执行)和 - DB2作为数据库。
我有一个在大型机数据集中读取数据库的键列表。我知道我们可以将带有DB2表的sas数据集加入,如下所示。
%LET DSN=DSN;
%LET QLF=QUALIFIER;
PROC SQL;
CONNECT TO DB2(SSID=&DSN);
CREATE TABLE STAFFTBL AS
(SELECT * FROM SASDSET FLE,
CONNECTION TO DB2
(SELECT COL1, COL2, COL3
FROM &QLF..TABLE_NAME)
AS DB2 (COL1, COL2, COL3)
WHERE DB2.COL1 = FLE.COL1);
DISCONNET FROM DB2;
%PUT &SQLXMSG;
QUIT;
有人可以建议我,如果我有一个数据集,其中包含要插入大型机数据集的值列表,我们应该如何进行。
我们可以读取大型机数据集并获取SAS数据集中的值。但我无法猜测如何使用sas数据集向DB2插入值。
我知道我们可以使用COBOL来做到这一点。但我愿意学习是否有可能使用SAS。
谢谢!
解决方案: 必须分配库来写入DB。请参阅SAS手册here
答案 0 :(得分:1)
您的上述查询在工作库或声明默认库的任何位置创建本地SAS数据集。此表不连接到您的后端DB2数据库,而只是一个用作导入SAS的副本。
考虑使用ODBC SAS库建立实时连接。如果不是ODBC,请使用已安装的DB2 API SAS。连接后,指定数据库中的所有表将作为SAS库中的可用SAS数据集出现,这些不是导入的副本,而是实时表。然后运行任何proc sql
追加或使用proc.append
将记录从SAS插入表中。
以下是DSN或非DSN的一般示例,您可以根据您的凭据或数据库驱动程序类型进行修改。
* WITH DSN;
libname DBdata odbc datasrc="DSN Name" user="username" password="password";
* WITH DRIVER (NON-DSN) - CHECK DRIVER INSTALLATION;
libname DBdata odbc complete="driver=DB2 Driver; Server=servername;
user=username; pwd=password; database=databasename;";
追加程序:
* WITH SQL;
proc sql;
INSERT INTO DBdata.tableName (col1, col2, col3)
SELECT col1, col2, col3 FROM SASDATASET;
quit;
* WITH APPEND (ASSUMING COLUMNS MATCH TOGETHER);
proc datasets;
append base = DBdata.tableName
data = SASDATASET
force;
quit;
注意:请注意不要无意中添加,修改或删除SAS ODBC库中的任何表,因为这些数据集是实时表,因此的这些更改将反映出来在后端DB2数据库中。完成工作后,不要删除库(或者将清除所有表),只需从环境中取消分配:
libname DBdata clear;
答案 1 :(得分:0)
如果您具有必要的写访问权限,则应通过proc sql insert into
语句执行此操作。或者,如果您可以通过库访问db2表,则可以使用包含modify
和output
/ replace
语句的数据步骤。