2009-06-25 41 views
30

Có chức năng "chuyển đổi" nào trong máy chủ MS SQL cho phép truyền các loại an toàn (không ném ngoại lệ). Tôi cần một cái gì đó như "tryParse" trong C# lang nhưng như là câu lệnh SQL.Đúc máy chủ MS SQL mà không có ngoại lệ

Chi tiết hơn, tôi cần tuyên bố sau trả về 0 hoặc bất kỳ điều nào khác ngoài việc loại trừ ngoại lệ.

chọn chuyển đổi (float, 'fjsdhf')

cảm ơn trước.

Trả lời

8

Bạn có thể kiểm tra rằng một giá trị số với chức năng TSQL IsNumeric()

http://msdn.microsoft.com/en-us/library/ms186272.aspx

Và, trong trường hợp bạn chưa biết về nó, TSQL bây giờ có một cấu trúc cố gắng nắm bắt.

http://msdn.microsoft.com/en-us/library/ms179296.aspx

+0

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

+1 cho TRY ..CATCH - đó thực sự là cách để đi! –

+1

"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

3

Nếu phiên bản của SQL bạn đang sử dụng hỗ trợ CLR bạn có thể viết các phương pháp phong cách TryParse. \ Nó không đáp ứng tiêu chí của bạn thêm chức năng tùy chỉnh để các db mặc dù. Nhưng nó có thể sẽ nhanh hơn SQL UDF.

cái gì đó như

[SqlFunction] 
public static SqlDouble TryParseDouble(SqlString str) 
{ 
    Double d; 
    bool success = Double.TryParse(str, out d); 
    if (!success) 
    return SqlDouble.Null; 
    return new SqlDouble(d); 
} 
34

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.

+10

Trong SQL Server 2008 R2 'IsNumeric' trả về 0 hoặc 1 và không phải là boolean. Vì vậy, bạn cần 'WHEN ISNUMERIC (myvarcharcolumn) = 1' – row1

+0

Điểm tốt @ row1, cố định. – richardtallent

+1

Nó là một phương pháp tốt, nhưng vẫn đưa ra một lỗi nếu cột chỉ chứa '-'. – Styxxy

12

Trong SQL Server 2012 có những chức năng mới để đối phó với điều này

try_cast try_convert try_parse

0

FWIW, xem xét câu hỏi này là gần 6 tuổi: Trong SQL Server 2012 bạn có thể sử dụng TRY_CONVERT đó sẽ trở lại NULL về lỗi; đó có lẽ là chính xác những gì bạn muốn.

Các vấn đề liên quan