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

在SAS中创建DB2表会添加缺少的值,db2,odbc,sas,Db2,Odbc,Sas,当我试图将成员列表上传到DB2服务器时遇到了这个问题,并创建了一个简单的示例来解释这个问题 为了将本地创建的数据表从SAS 9.2连接到DB2数据仓库中的表(通过连接ODBC驱动程序访问),我的过程是将这些本地表放在包含声明的同一服务器(不同模式)上。其主要目的是筛选出成员ID包含在上传列表中的索赔列表 如果本地数据的第一行中缺少值(有时一个成员可能没有一段标识信息),那么本地端的数据在上传到DB2模式时会丢失几个非缺少的值。我附上了一个玩具示例,其中包含非敏感信息以突出问题 PROC IMPO

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

为了将本地创建的数据表从SAS 9.2连接到DB2数据仓库中的表(通过连接ODBC驱动程序访问),我的过程是将这些本地表放在包含声明的同一服务器(不同模式)上。其主要目的是筛选出成员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 OUT=WORK.druglist DATAFILE=“C:\Users\caden2\Desktop\druglist.xls”
DBMS=EXCEL替换;
范围=“'Tab 4#哮喘药物$”;
跑
临床试验数据;
设置药物列表(保留=药物类药物类通用GPI);
如果_N_=4,则删除;

如果
NULLCHAR=NO
数据集选项:

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

我很久没有使用DB2了,也不知道如何通过ODBC创建表。但是,我还将研究其他可用的数据集选项,特别是
DBCREATE\u TABLE\u OPTS
DBTYPE
,它们允许您显式定义表索引和列类型

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


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

我一般不喜欢回答自己的问题,但我想这可能是有人会偶然发现的

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

这看起来像下面记录的驱动程序缓冲问题 SAS注:

如果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。

我不确定这是SAS、DB2还是PEBKAC的错误,所以我标记了前两个。您能否修改您的问题,添加用于
诊所的完整SAS
libname
语句?另外,您确定DB2表本身的列值不正确吗
viewtable
是出了名的挑剔。我已经更新了描述以突出您的顾虑。我已经删除了我的用户名、密码、dsn和模式,但该语句是一个非常普通的ODBC声明。SQL调用没有指出“clinic”是远程库还是本地库。我可能需要再次打开它,但您的解决方案可以在我的玩具数据集上运行。我将尝试在更大、更真实的数据集上运行它,看看问题是否仍然存在。请注意,NULLCHAR=YES并没有解决该问题。但是,将“是”切换为“否”确实解决了问题。对于为什么告诉DB2 SAS null char应被视为val会导致非空字段中的删除消失,您是否有一个合理的解释?对我来说,你的解决方案和魔法是无法区分的;)。我只是在猜测,但我打赌这与创建表时使用的DB2列数据类型有关,如果它们具有
notnull
属性,也可能与之有关。通常,如果无法指定表索引,则会使用第一列,并且默认情况下可能会设置为
notnull
。SAS使用一个单引号作为字符“缺少值”(没有空值的概念),因此使用NULLCHAR=NO告诉SAS在插入行时发送一个空格而不是空值。要确认,请使用其他应用程序登录DB2并检查表上的DDL。必须打开它。发现这个解决方案对我的字符数据有效,但是使用数字数据,问题没有得到解决(NULLCHAR=YES或NULLCHAR=NO都不起作用)。我在你的问题中添加了ODBC标记,因为我认为这是罪魁祸首。在任何情况下,我都非常建议您使用SAS技术支持开设一条赛道。这闻起来像一个错误,他们可能有一个修复。我想你可能是对的,需要打开一张罚单。这个问题有点太小题大做了。