Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Convertir l'expression CASE en SQL en colonne dérivée dans SSIS

La morale de l'histoire suivante est que juste parce que vous pouvez faire quelque chose dans SSIS, ce n'est pas toujours une bonne idée.

Exemple concret, cette requête. Il serait beaucoup plus efficace d'utiliser la logique SQL existante pour générer la valeur finale que d'utiliser des colonnes dérivées ou une tâche de script dans SSIS (sans parler du gaspillage de mémoire de pipeline, de CPU, etc.)

Requête source

J'ai utilisé ce qui suit comme requête source.

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

Rechercher la position en pourcentage

Déterminez si un symbole de pourcentage existe dans la colonne. Cela crée une colonne appelée PercentPosition

FINDSTRING(FixedARMRateReductionLimit, "%",1)

Vérifier le texte du tarif

Cela devrait suffire à faire une simple comparaison comme le montre la première expression, mais j'avais des problèmes avec cela. Je suppose que c'est une conversion/comparaison de chaîne question (voir première note). Plutôt que de chercher une valeur booléenne, j'ai utilisé findstring pour générer la position ordinale.

FixedARMRateReductionLimit == "'Weekly PMMS Rate"
FINDSTRING(FixedARMRateReductionLimit,"Weekly PMMS Rate",1)

Dériver la sortie

Profitez de la double utilisation de l'Opérateur ternaire .

(RateTextPosition > 0) ? (PARAM_VAL_TXT) : (PercentPosition == 0) ? .2 : ((DT_NUMERIC, 18,2) SUBSTRING(FixedARMRateReductionLimit,1,PercentPosition - 1))/100

Vous auriez pu simplifier une partie de cela dans une tâche de script, mais je ferais juste la logique dans la source.