5

mogę cofnąć transakcję, jeśli wystąpi błąd:transakcja TSQL sprawdzanie zarówno @@ @@ błąd i ROWCOUNT po oświadczeniu

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 
... 

Ale jeśli nie ma żadnych wpisów w Table1 z transakcją Col1 = @Param1 zobowiązuje się powodzeniem, co jest dla mnie złe. Chciałbym sprawdzić, czy naprawdę jest zrobione Col2 = 'something'. Jeśli nie, wycofaj z określonym kodem powrotu.
Gdy próbuję wstawić @@rowcount czek po @@error czeku, jak następuje:

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 
... 

zawsze cofanie w tym momencie, ponieważ @@rowcount ocenia bardzo ostatnią wypowiedź więc zawsze równa 0.

Jak w takim przypadku sprawdzić zarówno liczbę @@error, jak i liczbę uszkodzonych wierszy?

Odpowiedz

11

Store zarówno na własnych zmiennych w jednym zapytaniu, a następnie sprawdzić:

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. Tak. To klasyczny błąd. –

Powiązane problemy