Morał z poniższej historii jest taki, że tylko dlatego, że możesz zrobić coś w SSIS, nie zawsze jest to dobry pomysł.
Przykładem jest to zapytanie. O wiele bardziej wydajne byłoby użycie istniejącej logiki sql do wygenerowania końcowej wartości niż użycie kolumn pochodnych lub zadania skryptu w SSIS (nie wspominając o marnowaniu pamięci potoku, procesora itp.)
Zapytanie źródłowe
Użyłem następującego jako zapytania źródłowego.
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
Znajdź pozycję procentową
Określ, czy w kolumnie istnieje symbol procentowy. Tworzy to kolumnę o nazwie PercentPosition
FINDSTRING(FixedARMRateReductionLimit, "%",1)
Sprawdź tekst oceny
Powinno wystarczyć proste porównanie, jak pokazuje pierwsze wyrażenie, ale miałem z tym problemy. Zakładam, że jest to konwersja/porównanie ciągu problem (patrz pierwsza uwaga). Zamiast bawić się z uzyskaniem wartości logicznej, użyłem findstring do wygenerowania pozycji porządkowej.
FixedARMRateReductionLimit == "'Weekly PMMS Rate"
FINDSTRING(FixedARMRateReductionLimit,"Weekly PMMS Rate",1)
Wyprowadź dane wyjściowe
Ciesz się podwójnym użyciem operatorem trójargumentowym .
(RateTextPosition > 0) ? (PARAM_VAL_TXT) : (PercentPosition == 0) ? .2 : ((DT_NUMERIC, 18,2) SUBSTRING(FixedARMRateReductionLimit,1,PercentPosition - 1))/100
Mógłbyś trochę uprościć w zadaniu skryptu, ale ja po prostu zrobię logikę w źródle.