5

tôi có thể rollback một giao dịch nếu một lỗi xảy ra:TSQL giao dịch kiểm tra cả @@ ERROR và @@ ROWCOUNT sau một tuyên bố

CREATE PROCEDURE [dbo].[MySproc] 
(
    @Param1 [int] 
) 
AS 
BEGIN TRAN 
SET NOCOUNT ON; 

SELECT @Param1 
UPDATE [dbo].[Table1] 
SET Col2 = 'something' 
WHERE Col1 = @Param1 

IF @@ERROR <> 0 
BEGIN 
    ROLLBACK TRAN 
    RETURN -12 
END 
... 

Nhưng nếu không có mục trong Table1 quan đến giao dịch Col1 = @Param1 cam kết thành công, điều đó thật tệ cho tôi. Tôi muốn kiểm tra xem Col2 = 'something' có thực sự được thực hiện hay không. Nếu không, sau đó rollback với một mã trả về cụ thể.
Nếu tôi cố gắng để chèn @@rowcount séc sau @@error kiểm tra, như sau:

CREATE PROCEDURE [dbo].[MySproc] 
(
    @Param1 [int] 
) 
AS 
BEGIN TRAN 
SET NOCOUNT ON; 

SELECT @Param1 
UPDATE [dbo].[Table1] 
SET Col2 = 'something' 
WHERE Col1 = @Param1 

IF @@ERROR <> 0 
BEGIN 
    ROLLBACK TRAN 
    RETURN -12 
END 

IF @@ROWCOUNT = 0 
BEGIN 
    ROLLBACK TRAN 
    RETURN -27 
END 
... 

nó luôn luôn rollbacks vào thời điểm này, bởi vì @@rowcount đánh giá báo cáo kết quả cuối cùng nên nó luôn luôn bằng 0.

Làm sao để kiểm tra cả hai số @@error và số hàng bị ảnh hưởng?

Trả lời

11

cửa hàng cả vào các biến của riêng bạn trong một truy vấn duy nhất, sau đó kiểm tra:

DECLARE @rc int 
DECLARE @err int 
SELECT @Param1 
UPDATE [dbo].[Table1] 
SET Col2 = 'something' 
WHERE Col1 = @Param1 
SELECT @rc = @@ROWCOUNT,@err = @@ERROR 

IF @err <> 0 
BEGIN 
    ROLLBACK TRAN 
    RETURN -12 
END 

IF @rc = 0 
BEGIN 
    ROLLBACK TRAN 
    RETURN -27 
END 
+0

+1. Vâng. Đó là một sai lầm kinh điển. –

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