La morale della seguente storia è che solo perché tu puoi fare qualcosa in SSIS, non è sempre una buona idea.
Caso in questione, questa domanda. Sarebbe molto più efficiente utilizzare la logica sql esistente per generare il valore finale rispetto all'utilizzo di colonne derivate o un'attività di script in SSIS (per non parlare dello spreco di memoria della pipeline, CPU, ecc.)
Richiesta di origine
Ho usato quanto segue come query di origine.
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
Trova posizione percentuale
Determina se nella colonna è presente un simbolo di percentuale. Questo crea una colonna chiamata PercentPosition
FINDSTRING(FixedARMRateReductionLimit, "%",1)
Controlla il testo della tariffa
Dovrebbe essere sufficiente fare un semplice confronto come mostra la prima espressione, ma stavo riscontrando problemi con esso. Presumo che sia una conversione/confronto di stringhe problema (vedi prima nota). Invece di cercare di ottenere un valore booleano, ho usato findstring per generare la posizione ordinale.
FixedARMRateReductionLimit == "'Weekly PMMS Rate"
FINDSTRING(FixedARMRateReductionLimit,"Weekly PMMS Rate",1)
Deriva output
Goditi il doppio utilizzo dell'operatore ternario .
(RateTextPosition > 0) ? (PARAM_VAL_TXT) : (PercentPosition == 0) ? .2 : ((DT_NUMERIC, 18,2) SUBSTRING(FixedARMRateReductionLimit,1,PercentPosition - 1))/100
Avresti potuto semplificare parte di questo in un'attività di script, ma avrei semplicemente eseguito la logica nel sorgente.