1

当我尝试将成员列表上传到我们的 DB2 服务器时遇到了这个问题,并创建了一个最小示例来解释这个问题。

为了将 SAS 9.2 中本地创建的数据表连接到我们的 DB2 数据仓库中的表(通过与 ODBC 驱动程序的连接进行访问),我的过程是将这些本地表放在包含索赔。这样做的主要目的是过滤出上传列表中包含 member_ID 的声明列表。

如果本地数据的第一行中存在缺失值(有时成员可能没有一条标识信息),则本地端的数据在上传到 DB2 模式时会丢失几个非缺失值。我附上了一个带有非敏感信息的玩具示例以突出问题。

PROC IMPORT OUT= WORK.druglist DATAFILE= "C:\Users\caden2\Desktop\druglist.xls" 
DBMS=EXCEL REPLACE; 
RANGE="'Tab 4# Asthma Meds$'"; 
RUN;

DATA for_clinical;
SET druglist(KEEP= Drug_Class Drug_Type Generic GPI);
IF _N_ = 4 THEN DELETE;
IF _N_ <= 10;
IF _N_ = 1 THEN DO;
    Drug_Class=''; 
    Drug_Type='';
    Generic='';
    END;
RUN;

libname clinic odbc user=XXX password=XXX dsn=DWName schema=DWSchema autocommit=yes;

PROC SQL;
DROP TABLE clinic.caden_test;
CREATE TABLE clinic.caden_test AS
    SELECT * FROM for_clinical;
QUIT;

PROC IMPORT 和 Data 步骤只是将数据转换为我需要的形式,应该没有任何问题。临床图书馆是使用我的凭据通过与我们的数据仓库的 ODBC 连接创建的。下面的截图显示了本地机器和临床服务器上数据集的前后对比(注意第一行有一些缺失)。我没有发布日志。可怕的是,我的日志没有提供任何错误的迹象。

在此处输入图像描述

这是 DB2、SAS 还是 SAS 和 DB2 组合的问题?我无法复制从本地到本地或 DB2 到 DB2 的问题。此外,删除的值始终以对角线形式出现。对于更广泛的数据(超过 4 个变量),它从随机行开始,并沿对角线向上和向右进行,直到到达最后一列。

为了解决 BellevueBob 在评论中的担忧,即不是 Viewtable 搞砸了,这里是临床数据的 PROC FREQ 的输出,表明确实存在缺失。在此处输入图像描述

BellevueBob 的答案适用于缺少数据是字符的情况,但以相同的方式创建数据表,但使用数字数据,该解决方案不像处理字符数据那样工作。

4

2 回答 2

1

尝试使用NULLCHAR=NO数据集选项:

PROC SQL;
   DROP TABLE clinic.caden_test;
   CREATE TABLE clinic.caden_test(NULLCHAR=NO) AS
   SELECT * FROM for_clinical3;
QUIT;

这是一个 SAS 参考

我已经有一段时间没有使用 DB2 并且不知道如何通过 ODBC 创建表。但是,我还将研究其他可用的数据集选项,特别是DBCREATE_TABLE_OPTSDBTYPE,它允许您显式定义表索引和列类型。

编辑:根据 OP 评论更正答案。

NULLCHAR=NO选项告诉 SAS 在插入缺失值时向数据库发送一个空白字符,而不是将值设置为 NULL。虽然这可行,但它可能值得 SAS 使用说明。

于 2013-04-19T00:41:29.080 回答
1

我通常不喜欢回答我自己的问题,但我认为这可能是有人可能会偶然发现的问题。

我联系了 SAS 技术支持,措辞与这个问题几乎相同,这是他们的回答:

这看起来像以下 SAS 说明中记录的驱动程序缓冲问题:

http://support.sas.com/kb/38/214.html

如果 insertbuff 修复它,那么您可能希望了解有关获取 IBM Db2 ODBC 驱动程序的信息。让我知道这是否不是问题。

对于我的原始示例,解决方案就像在原始 libname 语句中添加一个附加选项一样简单。代替

libname clinic odbc user=XXX password=XXX dsn=DWName schema=DWSchema autocommit=yes;

新的声明将是

libname clinic odbc user=XXX password=XXX dsn=DWName schema=DWSchema insertbuff=1 autocommit=yes;

此修复适用于数字和字符数据。幸运的是,这种极端情况问题似乎只适用于 DB2。

于 2013-04-23T20:55:07.223 回答