【发布时间】:2012-02-14 18:12:19
【问题描述】:
在 SQL Server 2008 中工作。我第一次尝试 SSIS 脚本,我需要模拟一些用 VB.net 编写的 if/then 条件逻辑。我找不到任何以前处理表达式中嵌套条件的问题,并相信我正在关注我通过 google 发现的派生列中嵌套条件的内容。
尝试在派生列转换编辑器中使用嵌套条件时收到错误消息。我收到的错误表明 SSIS 无法解析我的表达式。实际异常:“来自 HRESULT 的异常:0xC0204006 (Microsoft.SqlServer.DTSPipelineWrap)”
答案可能立即回答我的问题(并创建一个新问题)的问题:
- 有嵌套级别限制吗?
- 可以在 [表达式] 的条件 1 部分执行嵌套吗? [条件1]:[条件2]
我将给出两个 sn-ps,第一个是我实际插入的内容,第二个是更易于阅读的版本。希望有人能指出我的错误。
不确定它是否有方位,但请注意 [BusArea] 是在上一步中派生的列。
实际表达:
[BusArea] == "CCC" || [BusArea] == "NBU" || [BusArea] == "CA" ? (ISNULL([CASE_MORG]) or TRIM([CASE_MORG]) == "" ? ( ISNULL([TRX_MORG]) or TRIM([TRX_MORG]) == "" ? NULL(DT_WSTR,50) : [TRX_MORG]) : [CASE_MORG]) : (ISNULL([CASE_AGT]) or TRIM([CASE_AGT]) == "" ? ( ISNULL([TRX_AGT]) or TRIM([TRX_AGT]) == "" ? NULL(DT_WSTR,50) : [TRX_AGT]) : [CASE_AGT])
格式化以便于阅读:
[BusArea] == "CCC" || [BusArea] == "NBU" || [BusArea] == "CA" ?
(ISNULL([CASE_MORG]) or TRIM([CASE_MORG]) == "" ?
( ISNULL([TRX_MORG]) or TRIM([TRX_MORG]) == "" ?
NULL(DT_WSTR,50)
: [TRX_MORG]
)
: [CASE_MORG]
)
: (ISNULL([CASE_AGT]) or TRIM([CASE_AGT]) == "" ?
( ISNULL([TRX_AGT]) or TRIM([TRX_AGT]) == "" ?
NULL(DT_WSTR,50)
: [TRX_AGT]
)
: [CASE_AGT]
)
【问题讨论】:
-
两个建议:当表达式变得这么长时,有时将逻辑推送到脚本任务中会更容易。作为一般规则,请使用本机转换,直到它们变得过于笨拙。导致更好性能的另一个选项是在多个派生列转换中打破它。引擎可以更好地并行化小型离散变换中的操作,而不是 1-2 变换中的所有内容和厨房水槽。这也使调试变得稍微容易一些,因为附加的数据查看器可以提供对中间值的洞察。
-
作为一个潜在的解决方案:我遇到了三元运算符的问题,我试图将 NULL 版本作为选项之一。我相信我必须将整个结果转换为适当的类型,即使它应该已经根据内部类型弄清楚了。所以,试试
(DT_WSTR, 50) ([BusArea]...) -
我确实尝试按照建议声明数据类型,但无法使其正常工作。我将其全部移至 SQL。
标签: sql-server-2008 business-intelligence ssis