Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

lỗi chuyển đổi varchar thành float

Đ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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tweet vui nhộn về cuộc đời của một DBA

  2. khoảng cách giữa hai kinh độ và vĩ độ

  3. Một thay đổi quan trọng đối với Sự kiện mở rộng trong SQL Server 2012

  4. Tạo hàng dựa trên giá trị cột

  5. Tính toán số tháng đầy đủ giữa hai ngày trong SQL