Về suy nghĩ sau của bạn.
SQL Server 2012 giới thiệu TRY_CONVERT
cho nhu cầu này. Vì vậy, truy vấn sau sẽ trả về NULL chứ không phải là một lỗi.
SELECT TRY_CONVERT ( FLOAT, 'Fish')
Không có gì đảm bảo ngay cả với các gói nối tiếp rằng WHERE mệnh đề sẽ xảy ra trước SELECT được đánh giá. Như đã giải thích trong bài đăng blog này
từ SQL Server 2005 trở đi, điều này có nhiều khả năng xảy ra hơn các phiên bản trước. Thay đổi hành vi đối với các tính năng của Database Engine trong SQL Máy chủ 2005
cụ thể gọi điều này như sau.
Thảo luận thêm về hành vi này có trong một bài đăng blog hay khác của Craig Freedman Lỗi chuyển đổi và số học .
Trên các phiên bản trước năm 2012 và TRY_CONVERT bạn cần bọc CAST AS FLOAT trong một CASE bản tường trình. ví dụ:
SELECT CASE WHEN ISNUMERIC(Col)=1 THEN CAST(Col AS FLOAT) END AS Col
FROM Table
WHERE ISNUMERIC(Col)=1
Điều này vẫn không được đảm bảo tuyệt đối để tránh bạn gặp lỗi dưới dạng ISNUMERIC bản thân nó chỉ kiểm tra xem giá trị sẽ truyền đến một trong các kiểu dữ liệu số chứ không phải cụ thể là float Ví dụ về đầu vào không thành công là '.'
CASE được ghi lại hầu hết là ngắn mạch trong sách trực tuyến ( một số ngoại lệ được thảo luận ở đây
)
Bạn cũng có thể tìm thêm thảo luận / khiếu nại về điều này trong mục kết nối Máy chủ SQL không được tạo ra các lỗi phi logic và giải thích tốt về một vấn đề tương tự bởi SQLKiwi