SSIS:数据类型不会从字符串转换

时间:2014-04-18 15:22:15

标签: sql-server ssis

这是我在SSIS的第一次经历,而我只是疯了:没有工作
(不要害怕大帖子:大多数只是错误输出。)

我有两个具有相同字段的MS SQL数据库,我必须从第一个传输到nvarchar(32)又名DT_WSTR的第二个,其中类型不同。

数据及其示例:
" 时间戳"是" datetime2(7)"在目的地,来源看起来像ISO 8601:2013-12-19T00:00:00.000
" "是真实的"带有科学记数法的数字,测试例子有:17e + 10,17.14,17.14e + 5,1715E + 4,1714
四列只有不同的int(bigint,bigint,tinyint,int)。

现在我已经尝试了(警告很多引用):

  • 派生专栏。我使用像"(DT_DBTIMESTAMP2,7)时间"和"(DT_R4)值"。也许我使用了错误的类型,但我强烈怀疑:我搜索了很多,大多数文章(如this)都说我是对的。
  

错误:从ODS导入到DWH时的0xC0049064,派生列[2]:尝试执行类型转换时发生错误。

     

错误:从ODS导入到DWH时的0xC0209029,派生列[2]:SSIS错误代码DTS_E_INDUCEDTRANSFORMFAILUREONERROR。 "派生列"失败,因为错误代码0xC0049064发生,错误行处置"派生列。输出[派生列输出] .Columns [timestamp]"指定错误失败。指定组件的指定对象发生错误。在此之前可能会发布错误消息,其中包含有关失败的更多信息。

     

错误:从ODS导入到DWH时的0xC0047022,SSIS.Pipeline:SSIS错误代码DTS_E_PROCESSINPUTFAILED。组件"派生列"上的ProcessInput方法(2)在处理输入"派生列输入"时,错误代码为0xC0209029失败(3)。标识的组件从ProcessInput方法返回错误。该错误特定于组件,但错误是致命的,将导致数据流任务停止运行。在此之前可能会发布错误消息,其中包含有关失败的更多信息。   错误:从ODS导入到DWH时的0xC02020C4,OLE DB源[62]:尝试向数据流任务缓冲区添加行失败,错误代码为0xC0047020。

     

错误:0xC0047038从ODS导入到DWH,SSIS.Pipeline:SSIS错误代码DTS_E_PRIMEOUTPUTFAILED。 OLE DB Source上的PrimeOutput方法返回错误代码0xC02020C4。当管道引擎调用PrimeOutput()时,组件返回失败代码。失败代码的含义由组件定义,但错误是致命的,管道停止执行。在此之前可能会发布错误消息,其中包含有关失败的更多信息。

  • 明确更改源中的类型(因此它们匹配目标)并直接连接到目标。
  

错误:0xC020901C在Direct,OLE DB源[32]:OLE DB Source.Outputs [OLE DB源输出]。OLE列Source.Outputs [OLE DB源输出]上的[时间]。返回的列状态为:"由于可能丢失数据,无法转换该值。"。

     

错误:直接的OLEC0209029,OLE DB源[32]:SSIS错误代码DTS_E_INDUCEDTRANSFORMFAILUREONERROR。 " OLE DB Source.Outputs [OLE DB Source Output] .Columns [time]"失败,因为错误代码0xC0209072发生,错误行处置" OLE DB Source.Outputs [OLE DB Source Output] .Columns [time]"指定错误失败。指定组件的指定对象发生错误。在此之前可能会发布错误消息,其中包含有关失败的更多信息。

     

错误:Direct,SSIS.Pipeline上的0xC0047038:SSIS错误代码DTS_E_PRIMEOUTPUTFAILED。 OLE DB Source上的PrimeOutput方法返回错误代码0xC0209029。当管道引擎调用PrimeOutput()时,组件返回失败代码。失败代码的含义由组件定义,但错误是致命的,管道停止执行。在此之前可能会发布错误消息,其中包含有关失败的更多信息。

  • 数据转换。同样的结果:失败。
  

错误:转换时为0xC02020C5,数据转换[2]:转换列时数据转换失败"时间" (74)到第34栏;时间复制" (11)。转换返回状态值2和状态文本"由于潜在的数据丢失,无法转换该值。"。

     

错误:转换时的0xC0209029,数据转换[2]:SSIS错误代码DTS_E_INDUCEDTRANSFORMFAILUREONERROR。 "数据转换。输出[数据转换输出] .Columns [时间复制]"失败,因为错误代码0xC020907F发生,错误行处置"数据转换。输出[数据转换输出] .Columns [时间复制]"指定错误失败。指定组件的指定对象发生错误。在此之前可能会发布错误消息,其中包含有关失败的更多信息。

     

错误:转换时为0xC0047022,SSIS.Pipeline:SSIS错误代码DTS_E_PROCESSINPUTFAILED。组件上的ProcessInput方法"数据转换" (2)在处理输入"数据转换输入"时,错误代码为0xC0209029失败(3)。标识的组件从ProcessInput方法返回错误。该错误特定于组件,但错误是致命的,将导致数据流任务停止运行。在此之前可能会发布错误消息,其中包含有关失败的更多信息。

     

错误:转换时为0xC02020C4,OLE DB源[62]:尝试向数据流任务缓冲区添加行失败,错误代码为0xC0047020。

     

错误:转换时为0xC0047038,SSIS.Pipeline:SSIS错误代码DTS_E_PRIMEOUTPUTFAILED。 OLE DB Source上的PrimeOutput方法返回错误代码0xC02020C4。当管道引擎调用PrimeOutput()时,组件返回失败代码。失败代码的含义由组件定义,但错误是致命的,管道停止执行。在此之前可能会发布错误消息,其中包含有关失败的更多信息。

所以现在我用完了工具和想法如何做到这一点:大多数说明只是说"将其映射到那个并且它将起作用"。我努力奋斗这么久,我甚至为此创建了一个StackExchange帐户。任何帮助赞赏。欢呼声。

3 个答案:

答案 0 :(得分:2)

此消息

The value could not be converted because of a potential loss of data.

告诉你几乎所有你需要知道的事情。您的问题不在于您使用的类型,而在于源代码中的数据。

最可能的原因是源ODS中至少有一行数据具有无法重新格式化的值(例如)DB_TIMESTAMP。

我推荐的方法是在SQL源语句中显式地转换所有源列。

所以而不是

select time, value from source

DO

select (cast time as datetime) as time, (cast value as int) as value from source

实际上,我会对源表运行此查询,以确保所有值都可以正确地转换为最终字段。 (我的猜测不是,否则你不会犯错误。)

您可以做的另一件事是将任务组件从错误“失败”更改为“重定向错误行”并将错误行推送到文件目标中,以便您可以看到转换组件将哪些行踢出。 / p>

答案 1 :(得分:0)

对旧问题的新答案 - 但我只是试图解决这个错误。多个错误路径,数据转换,派生列等无法正常工作。有两件事解决了这个错误:

我注意到在处理Curreny(Null)时,带有DT_CY值的列导致错误。 我最终通过检查Flat File Source节点内的一个小框"Retain null values from source as null values in the data flow"来解决错误。 (为什么这个不是被聋人选中了??)

其次,我很难将日期转换为字符串 - 一个简单的解决方案是在控制流中的执行SQL任务中执行更新语句。

例如:您的数据库列为varcharnvarchar。您的来源的数据位于mm/dd/yyyy。无论你多少次尝试与上述错误搏斗,将其转换为字符串都会失败。

我通过加载数据解决了这个问题(如果你愿意,你可以使用临时表)然后使用SQL查询转换这个列。我个人用过:

update MY_TABLE_NAME 
set [MY_DATE_COLUMN] = convert(varchar(8),CONVERT (datetime,[MY_DATE_COLUMN] ), 112)
where (FILTER_STATEMENT_TO_UPDATE_ONLY_WHAT_YOU_JUST_LOADED)

希望这可以帮助那些偶然发现这篇文章的人。

答案 2 :(得分:0)

enter image description here

(DT_R8)(REPLACE(Knowledgeable,"\"","") == "" ? NULL(DT_R8) : (DT_R8)REPLACE(Knowledgeable,"\"",""))

尝试上面的代码。

正在发生的事情是您正在尝试转换具有 double qoutes 的值。这就是为什么它给您一个错误。用空字符串替换双qoute将解决此问题。