Có một vài vấn đề khác nhau đồng thời xuất hiện ở đây. Hãy xem xét một số trong số chúng:
-
Bạn đang truyền các số dưới dạng DECIMAL (18, 18). Điều đó có nghĩa là "cho tôi một số có chỗ cho TỔNG 18 ký tự và 18 ký tự trong số đó phải ở sau số thập phân". Điều đó hoạt động tốt miễn là số của bạn nhỏ hơn 0 (đúng với tất cả các số E) nhưng nó sẽ bị hỏng nếu bạn cố gắng sử dụng nó trên các số> 0. Đối với các số> 0, chỉ cần truyền là DECIMAL mà không chỉ định bất kỳ điều gì khác .
-
Trong trường hợp bạn thêm "WHEN @d like '% E +%' THEN CAST (@d AS FLOAT)", bạn sẽ nhận được các kết quả khác nhau cho các số <0 bởi vì engine ngầm truyền kết quả khác. Tôi không biết các quy tắc về cách máy chủ sql quyết định truyền kết quả CASE, nhưng rõ ràng việc thực hiện thay đổi được đề xuất của bạn khiến công cụ sửa lại nó theo một cách khác. Truyền rõ ràng các kết quả đó dưới dạng số thập phân sẽ khắc phục được sự cố.
-
Bạn cần phải LTRIM và RTRIM kết quả của mình một cách nhất quán. Bạn có thể thêm LTRIM và RTRIM vào mỗi câu lệnh trường hợp hoặc bạn có thể chỉ LTRIM và RTRIM kết quả của trường hợp đó.
Đây là một giải pháp sẽ giải quyết hoàn toàn mọi thứ:
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))