2011-10-27 12 views
5

Tôi đã thừa hưởng mã mà trông như thế này:Hiệu suất TSQL với @@ Lỗi và chúng có thể được thay thế không?

Stored Procedure UpdateSomeStuff

Update Table1 Set [email protected] 

IF @@Error > 0 Goto ERR 

Update Table2 Set [email protected] 

IF @@Error > 0 Goto ERR 

RETURN 0 

ERR: 

return -1; 

sp này được gọi bằng ADO.NET trong C# như thế này

try 
{ 
    myCommand.ExecuteNonQuery(); 
} 
catch (System.Exception ex) 
{ 
    _log.Error(ex); 
    throw(); 
} 
finally 
{ 
    if(myConnection!=null) 
    { 
      myConnection.Close(); 
    } 
} 

Tôi chỉ hỏi Bản thân mình: Có phải là phần NẾU @@ Lỗi> 0 Goto ERR có phù hợp với mọi thứ không? Nếu một lỗi xảy ra, sp sẽ trả về và một ngoại lệ sẽ bị bắt trong phương thức gọi.

Mã gọi không xử lý giá trị trả về 0 và -1. Kế hoạch của tôi sẽ loại bỏ tất cả Errorhandling trong thủ tục lưu trữ một kết quả tương tự. Tôi có đúng hay có điều gì đó tôi đã bỏ lỡ không?

+0

Không, nếu có lỗi, các câu lệnh còn lại của SP sẽ vẫn thực thi. Nếu ý định là KHÔNG tiếp tục thực hiện T-SQL còn lại, bạn phải giữ cho kiểm tra lỗi được thực hiện. Nhưng tôi ngạc nhiên là không có giao dịch nào liên quan đến SP gốc. – HardCode

Trả lời

1

'2 cent' My bạn sẽ giết hiệu suất bằng cách loại bỏ nếu @ lỗi các câu lệnh. do đó, hoặc bạn thực hiện thử bắt như mitch nói hoặc không loại bỏ chúng. Chỉ cần nghĩ rằng nếu có lỗi tại câu lệnh đầu tiên thì nó sẽ không cố gắng thực hiện câu lệnh thứ 2 và cứ như vậy khi bạn có nếu @ báo cáo lỗi.

và nếu bạn xóa chúng, máy chủ sql sẽ thử tuyên bố tiếp theo cho đến khi đạt đến giới hạn khi quyết định không thể tiếp tục xử lý tiếp.

7

Một cách tiếp cận tốt hơn (SQL Server 2005 trở đi) là sử dụng TRY..CATCH:

BEGIN TRY 
    -- Perform operations here 
END TRY 
BEGIN CATCH 
    SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_MESSAGE() AS ErrorMessage; 
END CATCH 

Một tài liệu tham khảo tốt là: Error Handling in SQL 2005 and Later

+0

Điều này sẽ vẫn chạy vào khối catch của phương pháp gọi điện thoại? Bởi vì đó là những gì tôi cần. –

+1

Nếu bạn nêu ra lỗi nếu thủ tục lưu sẵn của bạn, nó có thể bị chặn bởi khối catch của mã C#. –

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