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