này sẽ mặc định không numerics 0 và sẽ không yêu cầu tuyên bố khác:
SELECT CASE
WHEN ISNUMERIC(myvarcharcolumn)=1 THEN
CONVERT(float, REPLACE(LTRIM(RTRIM(myvarcharcolumn)), ',', '.'))
ELSE 0 END AS myfloatcolumn
Chức năng REPLACE() gọi được sử dụng để thay đổi dấu phẩy để giai đoạn. Dấu phẩy được sử dụng trong một số nền văn bản dưới dạng dấu phân cách thập phân (ví dụ: "1,25" thay vì "1,25"), nhưng trừ khi máy chủ của bạn được thiết lập với một trong số đó làm văn bản mặc định, ISNUMERIC() sẽ trả về 1 nhưng CONVERT () sẽ ném một lỗi. Điều này không có nghĩa là các chuỗi của bạn không được sử dụng dấu phẩy làm dấu phân cách hàng nghìn, nhưng trong hầu hết các trường hợp, dấu phẩy cho phần giữ chỗ thập phân có nhiều khả năng là phần giữ chỗ thập phân.
Cuộc gọi LTRIM (RTRIM()) là vì ISNUMERIC() sẽ trả về 1 cho một chuỗi có khoảng trắng đầu hoặc cuối, nhưng CONVERT() không thể xử lý chúng. Vì vậy, bạn phải cắt dây của bạn.
Vấn đề tiềm năng duy nhất còn lại là ISNUMERIC() sẽ trả về 1 nếu số có thể được biểu diễn dưới dạng int, tiền tệ, số thập phân hoặc float, nhưng bạn chỉ chuyển đổi sang phao. Thực tế, một float có thể lưu trữ bất cứ thứ gì bạn ném vào nó, nhưng nếu bạn đang cố chuyển sang int thay vào đó, ISNUMERIC() sẽ trả về 1 cho một giá trị như "2.5", nhưng CONVERT (int, '2.5') sẽ vẫn ném một lỗi.
TRY CATCH không phù hợp với giải pháp của tôi vì tôi bị giới hạn và không thể thêm câu bổ sung. Tôi xem xét để thêm chức năng bổ sung sẽ đúc một cách an toàn.Một cái gì đó như, "myconvert (loại, dữ liệu, giá trị mặc định)", tôi tự hỏi nếu có một cách khác mà sẽ miễn phí cho tôi từ thêm chức năng tùy chỉnh vào cơ sở dữ liệu. – AndrewG
+1 cho TRY ..CATCH - đó thực sự là cách để đi! –
"CHỌN TRƯỜNG HỢP" trong câu trả lời dưới đây là tốt hơn và linh hoạt hơn TRY ... CATCH. – TamusJRoyce