这是我在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)。
现在我已经尝试了(警告很多引用):
错误:从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帐户。任何帮助赞赏。欢呼声。
答案 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任务中执行更新语句。
例如:您的数据库列为varchar
或nvarchar
。您的来源的数据位于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)