Điều đó có nghĩa là bạn có ít nhất một hàng trong bảng không thể chuyển sang float
. Thực hiện CASE
là an toàn, nhưng việc kết hợp CTE và thêm mệnh đề WHERE rơi vào lỗi sai phổ biến của các lập trình viên khi viết T-SQL:rằng thứ tự khai báo ngụ ý thứ tự thực hiện . Các lập trình viên đã quen với kiểu thủ tục mệnh lệnh của ngôn ngữ C giống như ngôn ngữ và không hiểu được bản chất dựa trên tập hợp khai báo của SQL. Tôi đã viết trước đây về vấn đề này và đưa ra các ví dụ khi ngụy biện gây ra lỗi:
Sau khi bạn đăng mã đầy đủ của mình, chúng tôi có thể biết chính xác bạn đã ngụy biện ở đâu trong trường hợp của mình và giả định một thứ tự thực thi nhất định.
sau khi cập nhật
OK, vì vậy tôi phải quản trị rằng trong trường hợp của bạn, mã đúng theo thứ tự thực thi, result
không thể chiếu cột khi đánh giá CASE
trước tiên . Nếu CASE nằm trong mệnh đề WHERE thì mọi thứ sẽ khác.
Vấn đề của bạn khác: ISNUMERIC
. Hàm này có một sự hiểu biết rất rộng rãi về những gì NUMERIC
có nghĩa là và đã cắn nhiều nhà phát triển trước đây. Cụ thể, nó chấp nhận các giá trị mà CAST và CONVERT sẽ từ chối. Giống như những cái có chứa dấu phẩy:
declare @n varchar(8000) = '1,000';
select isnumeric(@n);
select cast(@n as float);
select case when isnumeric(@n)=1 then cast(@n as float) else null end;
Vì vậy, bạn có các giá trị vượt qua ISNUMERIC
thử nghiệm nhưng không chuyển đổi được. Chỉ cần lưu ý, bạn càng đi sâu vào cách tiếp cận này, bạn sẽ thấy càng nhiều cánh cửa đóng lại. Không phải là cách an toàn để thực hiện truyền mà bạn cần ở phía máy chủ. Tốt nhất, hãy sửa mô hình dữ liệu (đặt trường trở thành float nếu nó lưu trữ các float). Ngoài ra, hãy phân loại dữ liệu và loại bỏ tất cả các giá trị không phải là float thích hợp, đồng thời sửa giao diện người dùng / ứng dụng để không giới thiệu những cái mới nữa, sau đó thêm một ràng buộc sẽ kích hoạt lỗi nếu các giá trị xấu mới xuất hiện. Bạn sẽ không thể giải quyết vấn đề này trong một truy vấn, con đường đó đầy xác người.
Với phiên bản SQL Server tiếp theo, bạn sẽ có một chức năng mới, TRY_CONVERT
, điều đó sẽ giải quyết được vấn đề của bạn.