5

posso rollback di una transazione in caso di errore:transazione TSQL verificando tanto @@ ERROR e @@ ROWCOUNT dopo una dichiarazione

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

Ma se non ci sono voci nel Table1 con l'operazione Col1 = @Param1 impegna con successo, che è male per me Vorrei verificare se lo Col2 = 'something' è davvero fatto. In caso contrario, eseguire il rollback con un codice di ritorno specifico.
Se provo ad inserire @@rowcount controllo dopo @@error di controllo, come il seguente:

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

si rollback sempre a questo punto, perché @@rowcount valuta l'ultima dichiarazione in modo che è sempre uguale 0.

Come verificare in tal caso sia il @@error sia il numero di righe interessate?

risposta

11

Conservare sia nelle proprie variabili in una singola query, quindi controllare:

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. Sì. È un errore classico. –