De moraal van het volgende verhaal is dat alleen omdat je kunt iets doen in SSIS, het is niet altijd een goed idee.
Een goed voorbeeld, deze vraag. Het zou veel efficiënter zijn om de bestaande sql-logica te gebruiken om de uiteindelijke waarde te genereren dan het gebruik van afgeleide kolommen of een scripttaak in SSIS (om nog maar te zwijgen van de verspilling van pijplijngeheugen, CPU, enz.)
Bronquery
Ik heb het volgende als bronquery gebruikt.
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
Percentage positie zoeken
Bepaal of er een percentagesymbool in de kolom staat. Dit creëert een kolom met de naam PercentPosition
FINDSTRING(FixedARMRateReductionLimit, "%",1)
Controleer op tarieftekst
Het zou voldoende moeten zijn om een eenvoudige vergelijking te maken, zoals de eerste uitdrukking laat zien, maar ik had er problemen mee. Ik neem aan dat het een stringconversie/vergelijking is probleem (zie eerste opmerking). In plaats van te rommelen met het verkrijgen van een booleaanse waarde, gebruikte ik findstring om de ordinale positie te genereren.
FixedARMRateReductionLimit == "'Weekly PMMS Rate"
FINDSTRING(FixedARMRateReductionLimit,"Weekly PMMS Rate",1)
Uitvoer afleiden
Profiteer van het dubbele gebruik van de Ternary-operator .
(RateTextPosition > 0) ? (PARAM_VAL_TXT) : (PercentPosition == 0) ? .2 : ((DT_NUMERIC, 18,2) SUBSTRING(FixedARMRateReductionLimit,1,PercentPosition - 1))/100
Je had een deel hiervan kunnen vereenvoudigen in een scripttaak, maar ik zou gewoon de logica in de broncode doen.