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.