我今天学到了两个新的 SSIS 知识。我创建了一个复制并得到了同样的错误
错误:数据流任务中的 0xC0049064,派生列 [2]:尝试执行类型转换时出错。
错误:数据流任务中的 0xC0209029,派生列 [2]:SSIS 错误代码 DTS_E_INDUCEDTRANSFORMFAILUREONERROR。 “派生列”失败,因为发生错误代码 0xC0049064,并且“派生列.输出 [派生列输出].列 [GuidCastError]”上的错误行处置指定错误失败。指定组件的指定对象发生错误。在此之前可能会发布错误消息,其中包含有关失败的更多信息。
错误:数据流任务中的 0xC0047022,SSIS.Pipeline:SSIS 错误代码 DTS_E_PROCESSINPUTFAILED。在处理输入“派生列输入”(3) 时,组件“派生列”(2) 上的 ProcessInput 方法失败,错误代码为 0xC0209029。已识别的组件从 ProcessInput 方法返回错误。该错误是特定于组件的,但该错误是致命的,将导致数据流任务停止运行。在此之前可能会发布错误消息,其中包含有关失败的更多信息。
次要的是,我无法创建 DT_GUID 类型的变量,即使它是有效的数据类型。
但我知道他们将 GUID 用于包 ID 和执行 ID 等内容,因此我打开了“变量”窗口并检查了“显示系统范围的变量”,因为我知道他们在那里有 GUID。我观察到ExecutionInstanceGUID 的类型是String 他们列出的值是{0908C691-9E2A-4D42-8111-A7D98DE17BD9}。这些大括号最终成为解决问题的意外关键。
重写和简化你的表达方式
(DT_GUID)(industrycode == 100000009 ? "{280f1c20-ad3b-eb11-c345-000d3a23cdb4}" : (industrycode == 100000003) ? "{23cc76d9-d345-eb11-a813-000d3a23cdb4}" : "{00000000-0000-0000-0000-000000000000}")
我使用查询作为测试源
select newid() AS cluster
, D.*
FROM
(
SELECT 100000009 AS industrycode, 'case1' AS accountid
UNION ALL
SELECT 100000003 AS industrycode, 'case2' AS accountid
UNION ALL
SELECT 100000000 AS industrycode, 'case3' AS accountid
) D
您表示 accountid 是一个 guid,但为了我的测试,我想要文本,以便我可以观察它。
如果您还有其他情况,我建议您跳过派生列转换并使用查找任务。像这样写下你的查询
SELECT *
FROM
(
VALUES
(100000009, cast('280f1c20-ad3b-eb11-c345-000d3a23cdb4' AS uniqueidentifier))
,(100000003, cast('23cc76d9-d345-eb11-a813-000d3a23cdb44' AS uniqueidentifier))
)D(industrycode, cluster)
我会将其配置为忽略查找失败。如果您使用我的源查询运行它,您将看到未处理全零 guid 的“其他”情况。
通过在之后添加一个使用类似表达式的派生列来解决该问题
IsNull(cluster_lkp)? (DT_GUID) "{00000000-0000-0000-0000-000000000000}" : cluster_lkp