Ci sono un paio di problemi diversi che si incontrano qui allo stesso tempo. Diamo un'occhiata ad alcuni di loro:
-
Stai lanciando numeri come DECIMAL(18, 18). Ciò significa "dammi un numero che ha spazio per un TOTALE di 18 caratteri e 18 di questi dovrebbero essere dopo il decimale". Funziona bene finché il tuo numero è inferiore a 0 (che è vero per tutti i numeri E) ma si interromperà se provi a usarlo su numeri> 0. Per numeri> 0, lancia come DECIMAL senza specificare nient'altro .
-
Nel caso in cui aggiungi "WHEN @d like '%E+%' THEN CAST(@d AS FLOAT)", ottieni risultati diversi per i numeri <0 perché il motore sta implicitamente trasmettendo il risultato in modo diverso. Non conosco le regole su come sql server decide di trasmettere i risultati CASE, ma a quanto pare apportare la modifica proposta fa sì che il motore lo riformi in un modo diverso. Il cast esplicito di questi risultati come decimali risolve il problema.
-
Devi LTRIM e RTRIM i tuoi risultati in modo coerente. Puoi aggiungere LTRIM e RTRIM a ciascuna istruzione del caso, oppure puoi semplicemente LTRIM e RTRIM i risultati del caso.
Ecco una soluzione che dovrebbe risolvere completamente tutto:
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))