将SQL中的CASE表达式转换为SSIS中的派生列

use*_*594 -3 sql ssis sql-server-2008

CASE 
        WHEN CHARINDEX('%', '{FixedARMRateReductionLimit}') > 0 THEN
            CAST(SUBSTRING('{FixedARMRateReductionLimit}', 0, 
               CHARINDEX('%', '{FixedARMRateReductionLimit}')) as decimal)/100
        WHEN '{FixedARMRateReductionLimit}' = 'Weekly PMMS Rate' THEN
            PARAM_VAL_TXT
        ELSE
            .02
    END
Run Code Online (Sandbox Code Playgroud)

bil*_*nkc 6

以下故事的寓意是,仅仅因为你可以在SSIS中做一些事情,这并不总是一个好主意.

例如,这个查询.使用现有的sql逻辑生成最终值比使用SSIS中的派生列或脚本任务(更不用说浪费管道内存,CPU等)要高效得多

来源查询

我使用以下作为源查询.

SELECT '50%' AS FixedARMRateReductionLimit, .1 AS PARAM_VAL_TXT
UNION ALL  SELECT 'Weekly PMMS Rate' AS FixedARMRateReductionLimit, .3 AS PARAM_VAL_TXT
UNION ALL  SELECT 'Frack',  .5
Run Code Online (Sandbox Code Playgroud)

查找百分比位置

确定列中是否存在百分比符号.这会创建一个名为的列PercentPosition

FINDSTRING(FixedARMRateReductionLimit, "%",1)
Run Code Online (Sandbox Code Playgroud)

检查费率文字

如第一个表达式所示,进行简单的比较就足够了,但我遇到了问题.我认为这是一个字符串转换/比较问题(参见第一个注释).我使用findstring来生成序数位置,而不是通过获取布尔值.

FixedARMRateReductionLimit == "'Weekly PMMS Rate"
FINDSTRING(FixedARMRateReductionLimit,"Weekly PMMS Rate",1)
Run Code Online (Sandbox Code Playgroud)

导出输出

享受三元运营商的双重用途.

(RateTextPosition > 0) ? (PARAM_VAL_TXT) : (PercentPosition == 0) ? .2 : ((DT_NUMERIC, 18,2) SUBSTRING(FixedARMRateReductionLimit,1,PercentPosition - 1))/100
Run Code Online (Sandbox Code Playgroud)

您可以在脚本任务中简化其中一些,但我只是在源代码中执行逻辑.