在SAS中创建DB2表会添加缺失值

时间:2013-04-18 23:04:41

标签: db2 odbc sas

当我尝试将成员列表上传到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导入和数据步骤只是为了将数据转换为我需要的形式,并且不应该有任何问题。临床库是通过使用我的凭据与我们的数据仓库的ODBC连接创建的。下面的屏幕截图显示了本地计算机和临床服务器上的数据集之前和之后(注意第一行有一些缺失)。我没有发布日志。可怕的是,我的日志没有表明出现任何问题。

enter image description here

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

为了解决BellevueBob在评论中所关注的问题,即不是Viewtable搞砸了,这是临床数据上PROC FREQ的输出,表明缺失确实存在。 enter image description here

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

2 个答案:

答案 0 :(得分:1)

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

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

这是 a SAS reference

我很长一段时间没有使用过DB2,也不知道如何通过ODBC创建表。但是,我还会研究其他可用的数据集选项,特别是DBCREATE_TABLE_OPTSDBTYPE,它们可以让您明确定义表索引和列类型。

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

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

答案 1 :(得分: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。