Morálka následujícího příběhu je taková, že jen proto, že můžete udělat něco v SSIS, není to vždy dobrý nápad.
Příkladem je tento dotaz. Bylo by mnohem efektivnější použít pro generování konečné hodnoty stávající logiku sql než použití odvozených sloupců nebo skriptové úlohy v SSIS (nemluvě o plýtvání pamětí potrubí, CPU atd.)
Zdrojový dotaz
Jako zdrojový dotaz jsem použil následující.
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
Najít procentuální pozici
Zjistěte, zda ve sloupci existuje symbol procent. Tím se vytvoří sloupec s názvem PercentPosition
FINDSTRING(FixedARMRateReductionLimit, "%",1)
Zkontrolujte text sazby
Mělo by stačit provést jednoduché srovnání, jak ukazuje první výraz, ale měl jsem s tím problémy. Předpokládám, že je to řetězcová konverze/porovnání problém (viz první poznámka). Spíše než se hrabat v získávání booleovské hodnoty jsem k vygenerování ordinální pozice použil řetězec findstring.
FixedARMRateReductionLimit == "'Weekly PMMS Rate"
FINDSTRING(FixedARMRateReductionLimit,"Weekly PMMS Rate",1)
Odvození výstupu
Užijte si dvojí využití Ternární operátor .
(RateTextPosition > 0) ? (PARAM_VAL_TXT) : (PercentPosition == 0) ? .2 : ((DT_NUMERIC, 18,2) SUBSTRING(FixedARMRateReductionLimit,1,PercentPosition - 1))/100
Něco z toho jste mohli zjednodušit v úloze skriptu, ale já bych jen udělal logiku ve zdrojovém kódu.