Há alguns problemas diferentes, todos se juntando aqui ao mesmo tempo. Vejamos alguns deles:
-
Você está lançando números como DECIMAL(18, 18). O que isso significa é "me dê um número que tenha espaço para um TOTAL de 18 caracteres, e 18 deles devem estar após o decimal". Isso funciona bem desde que seu número seja menor que 0 (o que é verdade para todos os números E), mas ele será interrompido se você tentar usá-lo em números> 0. Para números> 0, apenas converta como DECIMAL sem especificar mais nada .
-
No caso em que você adiciona "WHEN @d like '%E+%' THEN CAST(@d AS FLOAT)", você obtém resultados diferentes para números <0 porque o mecanismo está lançando implicitamente o resultado de maneira diferente. Eu não conheço as regras sobre como o sql server decide converter os resultados do CASE, mas aparentemente fazer sua alteração proposta faz com que o mecanismo o reformule de uma maneira diferente. A conversão explícita desses resultados como decimal corrige o problema.
-
Você precisa LTRIM e RTRIM seus resultados de forma consistente. Você pode adicionar LTRIM e RTRIM a cada instrução case ou pode apenas LTRIM e RTRIM os resultados do caso.
Aqui está uma solução que deve resolver totalmente tudo:
SELECT
LTRIM(RTRIM(CASE
WHEN @d like '%E-%' THEN CAST(CAST(@d AS FLOAT) AS DECIMAL(18,18))
WHEN @d like '%E+%' THEN CAST(CAST(@d AS FLOAT) AS DECIMAL)
ELSE @d
END))