Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Converter expressão CASE no SQL para coluna derivada no SSIS


A moral da história a seguir é que só porque você pode fazer algo no SSIS, nem sempre é uma boa ideia.

Caso em questão, esta consulta. Seria muito mais eficiente usar a lógica sql existente para gerar o valor final do que usar colunas derivadas ou uma tarefa de script no SSIS (sem mencionar o desperdício de memória do pipeline, CPU etc.)

Consulta de origem


Eu usei o seguinte como uma consulta de origem.
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 posição percentual


Determine se existe um símbolo de porcentagem na coluna. Isso cria uma coluna chamada PercentPosition
FINDSTRING(FixedARMRateReductionLimit, "%",1)

Verifique o texto da taxa


Deve ser suficiente fazer uma comparação simples como mostra a primeira expressão, mas eu estava tendo problemas com isso. Presumo que seja uma conversão/comparação de string problema (ver primeira Nota). Em vez de tentar obter um valor booleano, usei findstring para gerar a posição ordinal.
FixedARMRateReductionLimit == "'Weekly PMMS Rate"
FINDSTRING(FixedARMRateReductionLimit,"Weekly PMMS Rate",1)

Derivar saída


Aproveite o uso duplo do Operador ternário .
(RateTextPosition > 0) ? (PARAM_VAL_TXT) : (PercentPosition == 0) ? .2 : ((DT_NUMERIC, 18,2) SUBSTRING(FixedARMRateReductionLimit,1,PercentPosition - 1))/100

Você poderia ter simplificado um pouco disso em uma tarefa de script, mas eu apenas faria a lógica na fonte.