@@ERROR (Transact-SQL)
Gibt die Fehlernummer für die zuletzt ausgeführte Transact-SQL-Anweisung zurück.
Transact-SQL-Syntaxkonventionen
Syntax
@@ERROR
Rückgabetypen
integer
Hinweise
Gibt 0 zurück, wenn bei der vorherigen Transact-SQL-Anweisung keine Fehler auftraten.
Gibt eine Fehlernummer zurück, wenn bei der vorherigen Anweisung ein Fehler auftrat. Wenn es sich bei dem Fehler um einen der Fehler in der sys.messages-Katalogsicht handelt, enthält @@ERROR den Wert der sys.messages.message_id-Spalte dieses Fehlers. Sie können den zu einer @@ERROR-Fehlernummer gehörenden Text in sys.messages anzeigen.
Da @@ERROR nach jeder ausgeführten Anweisung gelöscht und zurückgesetzt wird, sollten Sie den Fehler sofort nach Überprüfung der Anweisung überprüfen oder ihn in einer lokalen Variablen speichern, die zu einem späteren Zeitpunkt überprüft werden kann.
In SQL Server 2005-Datenbankmodul wird zur Behandlung von Fehlern erstmalig das TRY...CATCH-Konstrukt verwendet. Das TRY...CATCH-Konstrukt unterstützt auch zusätzliche Systemfunktionen (ERROR_LINE, ERROR_MESSAGE, ERROR_PROCEDURE, ERROR_SEVERITY und ERROR_STATE), die mehr Fehlerinformationen als @@ERROR zurückgeben. TRY...CATCH unterstützt darüber hinaus eine ERROR_NUMBER-Funktion, die nicht darauf beschränkt ist, die Fehlernummer in der Anweisung zurückzugeben, die unmittelbar auf die Anweisung folgt, die einen Fehler generiert hat. Weitere Informationen finden Sie unter TRY...CATCH (Transact-SQL).
Beispiele
A. Verwenden von @@ERROR zum Erkennen eines bestimmten Fehlers
Dieses Beispiel verwendet @@ERROR zur Suche nach einer Verletzung einer CHECK-Einschränkung (Fehler #547) in einer UPDATE-Anweisung.
USE AdventureWorks;
GO
UPDATE HumanResources.Employee
SET PayFrequency = 4
WHERE NationalIDNumber = 615389812;
IF @@ERROR = 547
PRINT N'A check constraint violation occurred.';
GO
B. Verwenden von @@ERROR zur bedingten Beendigung einer Prozedur
Die IF...ELSE-Anweisungen in diesem Beispiel testen @@ERROR nach einer INSERT-Anweisung in einer gespeicherten Prozedur. Der Wert der @@ERROR-Variablen bestimmt den an das aufrufende Programm gesendeten Rückgabecode und gibt damit den Erfolg oder das Fehlschlagen der Prozedur an.
USE AdventureWorks;
GO
-- Drop the procedure if it already exists.
IF OBJECT_ID(N'HumanResources.usp_DeleteCandidate', N'P')
IS NOT NULL
DROP PROCEDURE HumanResources.usp_DeleteCandidate;
GO
-- Create the procedure.
CREATE PROCEDURE HumanResources.usp_DeleteCandidate
@CandidateID INT
AS
-- Execute the DELETE statement.
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = @CandidateID;
-- Test the error value.
IF @@ERROR <> 0
BEGIN
-- Return 99 to the calling program to indicate failure.
PRINT N'An error occurred deleting the candidate information.';
RETURN 99;
END
ELSE
BEGIN
-- Return 0 to the calling program to indicate success.
PRINT N'The job candidate has been deleted.';
RETURN 0;
END;
GO
C. Verwenden von @@ERROR mit @@ROWCOUNT
Dieses Beispiel verwendet @@ERROR mit @@ROWCOUNT zur Überprüfung der Ausführung einer UPDATE-Anweisung. Der Wert von @@ERROR wird auf Fehler überprüft, und @@ROWCOUNT wird verwendet, um sicherzustellen, dass die Aktualisierung erfolgreich auf eine Zeile in der Tabelle angewendet wurde.
USE AdventureWorks;
GO
IF OBJECT_ID(N'Purchasing.usp_ChangePurchaseOrderHeader',N'P')
IS NOT NULL
DROP PROCEDURE Purchasing.usp_ChangePurchaseOrderHeader;
GO
CREATE PROCEDURE Purchasing.usp_ChangePurchaseOrderHeader
@PurchaseOrderID INT,
@EmployeeID INT
AS
-- Declare variables used in error checking.
DECLARE @ErrorVar INT,
@RowCountVar INT;
-- Execute the UPDATE statement.
UPDATE PurchaseOrderHeader
SET EmployeeID = @EmployeeID
WHERE PurchaseOrderID = @PurchaseOrderID;
-- Save the @@ERROR and @@ROWCOUNT values in local
-- variables before they are cleared.
SELECT @ErrorVar = @@ERROR,
@RowCountVar = @@ROWCOUNT;
-- Check for errors. If an invalid @EmployeeID was specified
-- the UPDATE statement returns a foreign-key violation error #547.
IF @ErrorVar <> 0
BEGIN
IF @ErrorVar = 547
BEGIN
PRINT N'ERROR: Invalid ID specified for new employee.';
RETURN 1;
END
ELSE
BEGIN
PRINT N'ERROR: error '
+ RTRIM(CAST(@ErrorVar AS NVARCHAR(10)))
+ N' occurred.';
RETURN 2;
END
END
-- Check the row count. @RowCountVar is set to 0
-- if an invalid @PurchaseOrderID was specified.
IF @RowCountVar = 0
BEGIN
PRINT 'Warning: The EmployeeID specified is not valid';
RETURN 1;
END
ELSE
BEGIN
PRINT 'Purchase order updated with the new employee';
RETURN 0;
END;
GO
Siehe auch
Verweis
ERROR_LINE (Transact-SQL)
ERROR_MESSAGE (Transact-SQL)
ERROR_NUMBER (Transact-SQL)
ERROR_PROCEDURE (Transact-SQL)
ERROR_SEVERITY (Transact-SQL)
ERROR_STATE (Transact-SQL)
TRY...CATCH (Transact-SQL)
@@ROWCOUNT (Transact-SQL)
SET @local\_variable (Transact-SQL)
sys.messages (Transact-SQL)
Systemfunktionen (Transact-SQL)
Andere Ressourcen
Behandeln von Fehlern des Datenbankmoduls
Verwenden von @@ERROR
Verwenden von TRY...CATCH in Transact-SQL