将SQL中的大小写表达式转换为SSIS中的派生列

将SQL中的大小写表达式转换为SSIS中的派生列,sql,sql-server-2008,ssis,Sql,Sql Server 2008,Ssis,下面这个故事的寓意是,仅仅因为您可以在SSIS中做一些事情,这并不总是一个好主意 例如,这个查询。使用现有sql逻辑生成最终值要比在SSI中使用派生列或脚本任务高效得多(更不用说浪费管道内存、CPU等) 源查询 我将以下内容用作源查询 CASE WHEN CHARINDEX('%', '{FixedARMRateReductionLimit}') > 0 THEN CAST(SUBSTRING('{FixedARMRateReductionLimi

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

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

源查询 我将以下内容用作源查询

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
查找百分比位置 确定列中是否存在百分比符号。这将创建一个名为
PercentPosition

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
检查费率文本 正如第一个表达式所示,进行简单的比较就足够了,但我对此有疑问。我认为这是一个问题(见第一条注释)。我使用findstring来生成序号位置,而不是随意获取布尔值

FINDSTRING(FixedARMRateReductionLimit, "%",1)
导出输出 享受双重使用


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

这只是为了说明在派生转换中应该如何构造表达式。我不建议这样做,因为它很难维护

请参阅此问题的答案

下面是如何在派生转换中编写表达式

(RateTextPosition > 0) ? (PARAM_VAL_TXT) : (PercentPosition == 0) ? .2 : ((DT_NUMERIC, 18,2) SUBSTRING(FixedARMRateReductionLimit,1,PercentPosition - 1))/100
表达式的格式化版本

(FINDSTRING(FixedARMRateReductionLimit,"%",1) > 1) ? ((DT_NUMERIC,5,2)SUBSTRING(FixedARMRateReductionLimit,1,FINDSTRING(FixedARMRateReductionLimit,"%",1) - 1)) : (FixedARMRateReductionLimit == "Weekly PMMS Rate" ? (0.35) : (0.02))
使用的样本数据:

(FINDSTRING(FixedARMRateReductionLimit,"%",1) > 1) 
    ?   (
            (DT_NUMERIC,5,2) 
                SUBSTRING(  FixedARMRateReductionLimit, 
                            1, 
                            FINDSTRING(FixedARMRateReductionLimit, "%", 1) - 1
                          )
        ) 
    :   FixedARMRateReductionLimit == "Weekly PMMS Rate" 
            ? (0.35) 
            : (0.02))
在data viewer中查看衍生转换时的输出:


欢迎使用StackOverflow:如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮(
{}
),以精确地格式化和语法突出显示它!提供的代码似乎不准确。它是从某个数据访问层复制的吗
CHARINDEX(“%”,“{FixedARMRateReductionLimit}”)
将始终计算为0,因为第二个参数的值从未更改。上一个帐户是一个很好的答案。但是,将这种“复杂”的转换移动到脚本转换可能更方便、更友好。
(FINDSTRING(FixedARMRateReductionLimit,"%",1) > 1) 
    ?   (
            (DT_NUMERIC,5,2) 
                SUBSTRING(  FixedARMRateReductionLimit, 
                            1, 
                            FINDSTRING(FixedARMRateReductionLimit, "%", 1) - 1
                          )
        ) 
    :   FixedARMRateReductionLimit == "Weekly PMMS Rate" 
            ? (0.35) 
            : (0.02))
SELECT c1 AS FixedARMRateReductionLimit
FROM
(
            SELECT '2.00%'              AS c1 
    UNION   SELECT '13.95%'             AS c1 
    UNION   SELECT '%52.00%'            AS c1 
    UNION   SELECT '%%'                 AS c1 
    UNION   SELECT '85.%42%'            AS c1 
    UNION   SELECT 'Weekly PMMS Rate'   AS c1 
    UNION   SELECT 'Monthly PMMS Rate' 
) T1