以逗号分隔的csv文件具有空值,可通过dts包导入

问题描述 投票:1回答:1

我有一个DTS包,可以将CSV导入到我的sql server表中;该表的Rate_Code字段定义为Real类型的可为空的数字字段。我希望我的csv源能够将RATE_CODE列定义为NULL,因为该字段在数据库中可以为空。包有效,但仅适用于没有空值的行。

我尝试了以下csv:

ACCT_NO,RATE_CODE,POLR_INDICATOR,RunId
0000130209,NULL,1,99

错误:将列“ RATE_CODE”(137)转换为列“ RATE_CODE”(12)时,数据转换失败。转换返回状态值2和状态文本“该值由于潜在的数据丢失而无法转换。”

ACCT_NO,RATE_CODE,POLR_INDICATOR,RunId
0000130209,,1,99

相同错误。

我需要一个能够导入空字段的csv。

sql-server tsql ssis null dts
1个回答
2
投票

SQL Server无法将字符串值隐式转换为真实数据类型,因此您必须在包中进行显式转换,以处理空字符串或文本值'NULL'的情况。 ,我已经在大量平面文件中看到过。

在数据流中,您将需要在源和目标之间添加一个派生的列转换,以将这些缺失的值转换为数据类型为NULL的实际real

此表达式应该可以让您到达想要的位置。换行符是为了提高可读性。删除它们和注释以在包装中使用。

( (DT_WSTR, 1)[RATE_CODE] =="" ) ||      <-- If the string version is an empty string OR
( (DT_WSTR, 4)[RATE_CODE] =="NULL" ) ||  <-- If the string version is the word "NULL" OR
( ISNULL( [RATE_CODE] ))                 <-- If the column is actually NULL
?                                        <-- THEN
NULL(DT_R4)                              <-- Return a NULL of data type real
:                                        <-- ELSE
(DT_R4)[RATE_CODE]                       <-- Return the value of the column as a real data type

为了方便您复制和粘贴:

( (DT_WSTR, 1)[RATE_CODE] =="" ) || ( (DT_WSTR, 4)[RATE_CODE] =="NULL" ) || ( ISNULL( [RATE_CODE] )) ? NULL(DT_R4) : (DT_R4)[RATE_CODE] 

编辑:要使用此代码,请在Visual Studio / SQL Server数据工具(SSDT)中打开程序包。打开向导创建的数据流任务。删除平面文件源对象和OLEDB目标对象之间的箭头。转到SSIS工具箱,然后将“派生列转换”对象拖动到工作面上。将源连接到转换。打开转换。

在下面的框中,在“派生列名称”下,键入Rate_Code。在“派生列”下,单击下拉菜单,然后选择“替换“ Rate_Code””。在“表达式”下,从上方粘贴表达式。数据类型列应自动更改为浮点[DT_R4]。单击确定关闭转换编辑器。

将转换连接到目标对象。打开目标对象。在左侧,单击映射。确保源中的Rate_Code仍映射到目标的Rate_Code。如果不是,则将其映射(单击并按住源,然后拖动到目标并释放;应显示一条实心黑线。)

保存您的包,然后尝试再次执行。

© www.soinside.com 2019 - 2024. All rights reserved.