2014-09-11 14 views
17

Tôi có một kịch bản mà tôi cần một cái gì đó tương tự như .NET's try-catch-finally block.SQL Server TRY catch cuôi

On thử của tôi, tôi sẽ CREATE a #temp table, INSERT dữ liệu để nó & quá trình tập hợp dữ liệu khác dựa trên #temp.

Trên CATCH rồi RAISERROR. Có thể có một khối FINALLY tới DROP #temp không? Dưới đây là mã giả:

BEGIN TRY 
CREATE TABLE #temp 
(
    --columns 
) 
--Process data with other data sets 
END TRY 
BEGIN CATCH 
EXECUTE usp_getErrorMessage 
END CATCH 
BEGIN FINALLY 
DROP TABLE #temp 
END FINALLY 
+1

có thể trùng lặp với [Cuối cùng khoản trong giao dịch SQL Server? Một cái gì đó sẽ thực hiện không phân biệt thành công hay thất bại?] (Http://stackoverflow.com/questions/13054101/finally-clause-in-sql-server-transaction-something-that-will-execute-irrespecti) – stuartd

+1

Không, có không có CUỐI CÙNG. Bạn có thấy bất kỳ tham chiếu nào đến nó [trong tài liệu] (http://msdn.microsoft.com/en-us/library/ms175976.aspx) không? Bạn có chắc chắn muốn xóa một cách rõ ràng các bảng #temp của mình không? –

Trả lời

6

Thay vì tạo ra một bảng bạn chỉ có thể khai báo một biến bảng (mà sẽ tự động biến mất khi truy vấn kết thúc).

BEGIN TRY 
DECLARE @temp TABLE 
(
    --columns 
) 
--do stuff 
END TRY 
BEGIN CATCH 
--do other stuff 
END CATCH 
+1

Đây là một cách tiếp cận tốt khi dữ liệu bạn đang nắm giữ là nhỏ hoặc bạn không cần máy chủ sql để thực hiện bất kỳ tối ưu nào vì các biến bảng không tạo số liệu thống kê, v.v. sẽ không giải quyết nó nếu họ thực sự cần thiết để sử dụng một bảng tạm thời như trong ví dụ. Tôi ghét sử dụng câu lệnh GOTO nhưng trong T-SQL, tôi không biết chắc bạn sẽ đạt được điều đó như thế nào. GOTO l_Exit l_Exit: DROP TABLE #temp –

3

không có FINALLY tương đương.
một giải pháp thay thế có thể là các biến bảng nhưng không hoàn toàn giống nhau và phải được đánh giá theo từng trường hợp.
có một số SO question với các chi tiết rất hữu ích để đưa ra lựa chọn sáng suốt.
với các biến bảng bạn không cần phải dọn dẹp như bạn làm với các bảng tạm thời

+2

Một thay thế cho bảng tạm thời có thể là bảng tạm thời? Tôi nghĩ bạn có nghĩa là biến bảng. Ngoài ra [đây là một câu hỏi tốt hơn với nhiều chi tiết hơn] (http://dba.stackexchange.com/questions/16385/whats-the-difference-between-a-temp-table-and-table-variable-in -sql-server). –

+0

hem ... ty để nhận thấy lỗi chính ... – Paolo

14

Mặc dù không hoàn toàn giống như cuối cùng, phiên bản T-SQL của Try-Catch không cho phép điều đó mã mà cần thực hiện sau khi cả hai các khối Thử và Bắt có thể xảy ra sau khi kết thúc câu lệnh END CATCH. Sử dụng mã câu hỏi làm ví dụ:

BEGIN TRY 
     CREATE TABLE #temp 
     (
     --columns 
     ) 
     --Process data with other data sets 
    END TRY 
    BEGIN CATCH 
    EXECUTE usp_getErrorMessage 
    END CATCH; 

IF OBJECT_ID('tempdb..#temp') IS NOT NULL -- Check for table existence 
    DROP TABLE #temp; 

Lệnh DROP TABLE sẽ thực thi xem thử hoặc bắt thực thi. Xem: BOL Try...Catch