【问题标题】:Is there a nesting levels limit with expressions used in SSIS packages?SSIS 包中使用的表达式是否存在嵌套级别限制?
【发布时间】: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


【解决方案1】:

我认为嵌套条件没有任何限制。即使有,我认为我们创建的用于处理业务流程的包也不会达到极限。

你几乎把一切都搞对了。您的条件语句的问题是您使用了 or 而不是 ||

我复制了您的确切语句并将Derived Transformation 粘贴到Data Flow task 中,但由于包无法解析表达式而出现错误。我将所有 or's 替换为正确的 Logical OR (||) 运算符并且表达式计算正确。

【讨论】:

  • 嘿,谢谢!两个月前你在哪里?我从来没听过。
猜你喜欢
  • 1970-01-01
  • 2023-02-24
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 2017-02-12
  • 2015-02-20
  • 1970-01-01
相关资源
最近更新 更多