Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Converti l'espressione CASE in SQL in una colonna derivata in SSIS

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.