Моралът на следната история е, че просто защото можете направи нещо в 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
Намиране на процентна позиция
Определете дали в колоната съществува символ за процент. Това създава колона, наречена PercentPosition
FINDSTRING(FixedARMRateReductionLimit, "%",1)
Проверете за текст за оценка
Трябва да е достатъчно да се направи просто сравнение, както показва първият израз, но имах проблеми с него. Предполагам, че това е преобразуване/сравнение на низ проблем (вижте първата бележка). Вместо да се занимавам с получаване на булева стойност, използвах findstring за генериране на поредната позиция.
FixedARMRateReductionLimit == "'Weekly PMMS Rate"
FINDSTRING(FixedARMRateReductionLimit,"Weekly PMMS Rate",1)
Извличане на изход
Насладете се на двойното използване на троичен оператор .
(RateTextPosition > 0) ? (PARAM_VAL_TXT) : (PercentPosition == 0) ? .2 : ((DT_NUMERIC, 18,2) SUBSTRING(FixedARMRateReductionLimit,1,PercentPosition - 1))/100
Бихте могли да опростите част от това в скриптова задача, но аз просто бих използвал логиката в източника.