如何将指定SQL Server CASE查询转换为SSIS派生列表达式?
SSIS派生列组件对应表达式实现
以下表达式完全匹配给出的T-SQL查询逻辑,可直接在派生列组件中使用,默认输出数值类型:
FINDSTRING(DE_NOVEDAD,"/Op.",1) == 0 ? 0 : ( LEFT(RIGHT(SUBSTRING(DE_NOVEDAD,FINDSTRING(DE_NOVEDAD,"/Op. ",1),12),7),2) == "64" ? (DT_I4)REPLACE(REPLACE(REPLACE(RIGHT(SUBSTRING(DE_NOVEDAD,FINDSTRING(DE_NOVEDAD,"/Op.",1),12),7),"/",""),"C",""),".","") : 0 )
核心规则说明
- 函数对应关系
- T-SQL的
CHARINDEX(匹配串, 原字段)对应SSIS的FINDSTRING(原字段, 匹配串, 1),第三个参数固定填1,代表从字符串头部查找第一个匹配项,和CHARINDEX默认行为一致 - T-SQL的
LIKE '64%'无直接对应函数,通过LEFT(待校验字符串,2) == "64"实现,即判断目标字符串前两位为64 - T-SQL的
CASE WHEN分支判断,对应SSIS表达式的三元运算符判断条件 ? 成立返回值 : 不成立返回值 SUBSTRING/RIGHT/REPLACE的参数逻辑和T-SQL基本一致,注意SSIS表达式中字符串常量必须用双引号包裹,不能使用单引号
- T-SQL的
- 必要兼容处理
- 增加了
FINDSTRING(DE_NOVEDAD,"/Op.",1) == 0的前置判断,避免原字段中不存在"/Op."字符串时,FINDSTRING返回0导致SUBSTRING函数报起始位置非法的运行错误 - 对REPLACE处理后的字符串增加
(DT_I4)强转,保证THEN分支返回值和ELSE分支的0类型一致,避免派生列报类型不匹配错误 - 若需要输出字符串类型结果,可去掉
(DT_I4)强转,同时把ELSE分支的0改为"0"即可
- 增加了
注意原T-SQL中两处匹配串存在差异:WHEN分支查找的是带尾部空格的
/Op.,THEN分支查找的是不带空格的/Op.,如果是原SQL书写笔误,把表达式中两处FINDSTRING的匹配串统一即可,避免取值偏移。
内容的提问来源于stack exchange,提问作者Jonathan Villablanca
相关产品推荐
相关产品推荐

