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