Moralen i den følgende historie er, at bare fordi du kan gøre noget i SSIS, det er ikke altid en god idé.
Eksempelvis denne forespørgsel. Det ville være langt mere effektivt at bruge den eksisterende sql-logik til at generere den endelige værdi end at bruge afledte kolonner eller en scriptopgave i SSIS (for ikke at nævne spild af pipelinehukommelse, CPU osv.)
Kildeforespørgsel
Jeg brugte følgende som en kildeforespørgsel.
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
Find procentposition
Bestem, om der findes et procentsymbol i kolonnen. Dette opretter en kolonne kaldet PercentPosition
FINDSTRING(FixedARMRateReductionLimit, "%",1)
Se efter pristekst
Det burde være tilstrækkeligt at lave en simpel sammenligning, som det første udtryk viser, men jeg havde problemer med det. Jeg antager, at det er en strengkonvertering/sammenligning problem (se første note). I stedet for at knokle med at få en boolesk værdi, brugte jeg findstring til at generere ordenspositionen.
FixedARMRateReductionLimit == "'Weekly PMMS Rate"
FINDSTRING(FixedARMRateReductionLimit,"Weekly PMMS Rate",1)
Udled output
Nyd den dobbelte brug af Ternary operator .
(RateTextPosition > 0) ? (PARAM_VAL_TXT) : (PercentPosition == 0) ? .2 : ((DT_NUMERIC, 18,2) SUBSTRING(FixedARMRateReductionLimit,1,PercentPosition - 1))/100
Du kunne have forenklet noget af dette i en scriptopgave, men jeg ville bare gøre logikken i kilden.