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?
+1. Vâng. Đó là một sai lầm kinh điển. –