2009-05-28 27 views
14

Có thể sử dụng các khối TRY CATCH trong SQL Selects không?TRY CATCH trên một CONVERT trong một Tuyên bố Chọn

Đối với công cụ tương tự như sau ví dụ:

select 
    order, 
    CONVERT(DATETIME, orderDate) 
from orders 

cách tốt nhất để xử lý tình huống này là gì?

+2

Nếu IsDate là đúng, sau đó bạn có thể bỏ nó như là một ngày giờ. Đó là điểm của IsDate. – cjk

+0

@JohnIdol: ý của bạn là gì theo "chuẩn". ISO là một tiêu chuẩn cho một ví dụ. Các định dạng khác nhau có cho orderDate là gì? – Sung

+0

xin lỗi - Tôi đã nhầm lẫn - IsDate là tốt! – JohnIdol

Trả lời

20

Tôi không biết về try-catch, nhưng trong SQL Server bạn có chức năng IsDate và có thể có cho làm một cái gì đó giống như

CASE WHEN ISDATE(orderDate) = 1 THEN CONVERT(DateTime, orderDate) ELSE GETDATE() END 
+0

không hoạt động nếu orderDate là VarChar – Cherven

+6

Điều gì xảy ra nếu Định dạng ngày khác nhau? – Asher

1

Bạn có thể sử dụng chức năng IsDate():

SELECT ISDATE('11/13/2009') 
SELECT ISDATE('13/11/2009') 
2

Trong chính mệnh đề SELECT, không.

Bạn có thể kiểm tra cho một ngày mặc dù sử dụng ISDATE()

select 
    order, 
    CASE WHEN ISDATE(orderDate) = 1 THEN CONVERT(DATETIME, orderDate) ELSE NULL END 
from orders 
1

Tôi không nghĩ rằng một catch có thể bên trong một lựa chọn, nhưng bên ngoài là có thể khi bạn đang làm việc với các thủ tục lưu trữ.

begin try 
    select cast(strartnr as int) from table 
end try 
begin catch 
    select 10000 from table 
end catch 
10

Trong MS SQL Server 2012 có một cấu trúc mới mà thực hiện chính xác những gì được yêu cầu cho:


SELECT 
    CASE WHEN TRY_CONVERT(float, 'test') IS NULL 
    THEN 'Cast failed' 
    ELSE 'Cast succeeded' 
END AS Result; 
    GO 

Xem thêm http://msdn.microsoft.com/en-us/library/hh230993.aspx

+2

Thực sự tốt đẹp xD nhưng điều này chỉ hoạt động trong sql 2012, phải không? – MaikaDalila

+0

@MaikaDalila: Đúng vậy. – user10633

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