5

ich eine Transaktion Rollback kann, wenn ein Fehler auftritt:TSQL Transaktion Überprüfung sowohl @@ ERROR und @@ ROWCOUNT nach einer Erklärung

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

Aber wenn es keine Einträge in den Table1 mit der Col1 = @Param1 Transaktion erfolgreich verpflichtet, Das ist schlecht für mich. Ich würde gerne überprüfen, ob Col2 = 'something' wirklich fertig ist. Wenn nicht, Rollback mit einem bestimmten Rückgabecode.
Wenn ich versuche, @@rowcount Prüfung nach @@error Prüfung einzufügen, wie folgt aus:

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

es Rollbacks immer an dieser Stelle, weil @@rowcount die allerletzte Anweisung wertet, so dass es immer 0 entspricht.

Wie in so einem Fall sowohl die @@error als auch die Anzahl der betroffenen Zeilen überprüfen?

Antwort

11

Shop sowohl in eigene Variablen in einer einzigen Abfrage, dann überprüfen:

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. Ja. Es ist ein klassischer Fehler. –