La moraleja de la siguiente historia es que solo porque puedes hacer algo en SSIS, no siempre es una buena idea.
Caso en cuestión, esta consulta. Sería mucho más eficiente usar la lógica sql existente para generar el valor final que usar columnas derivadas o una tarea de secuencia de comandos en SSIS (sin mencionar el desperdicio de memoria de canalización, CPU, etc.)
Consulta de origen
Utilicé lo siguiente como consulta de origen.
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
Encontrar posición porcentual
Determine si existe un símbolo de porcentaje en la columna. Esto crea una columna llamada PercentPosition
FINDSTRING(FixedARMRateReductionLimit, "%",1)
Buscar texto de tarifa
Debería ser suficiente hacer una comparación simple como muestra la primera expresión, pero estaba teniendo problemas con ella. Supongo que es una conversión/comparación de cadenas problema (ver la primera nota). En lugar de jugar con la obtención de un valor booleano, utilicé findstring para generar la posición ordinal.
FixedARMRateReductionLimit == "'Weekly PMMS Rate"
FINDSTRING(FixedARMRateReductionLimit,"Weekly PMMS Rate",1)
Derivar salida
Disfrute del doble uso del operador ternario .
(RateTextPosition > 0) ? (PARAM_VAL_TXT) : (PercentPosition == 0) ? .2 : ((DT_NUMERIC, 18,2) SUBSTRING(FixedARMRateReductionLimit,1,PercentPosition - 1))/100
Podrías haber simplificado algo de esto en una tarea de secuencia de comandos, pero solo haría la lógica en el código fuente.