t-sql-Return-Fehler-Codes vs RaiseError
Hallo, ich Schreibe eine gespeicherte Prozedur zum ausführen eines batch-jobs auf einer stündlichen Zeitplan, und ich bin versucht, zu entscheiden, ob der Fehler zurückgeben wird, oder Sie heben. Vorausgesetzt, ich wäre die Protokollierung der Fehler in jedem job, die führen würde, um bessere performance und Wartbarkeit?
z.B.
--Mit Fehler-Codes
CREATE PROCEDURE Job1
AS
BEGIN
BEGIN TRY
--Do some work
END TRY
BEGIN CATCH
--log error
RETURN 1; --Return 1 for error
END CATCH
RETURN 0;
END
CREATE PROCEDURE USP_BatchJob
AS
BEGIN
BEGIN TRANSACTION;
DECLARE @Error INT;
EXEC @Error = Job1;
IF @Error <> 0
GOTO ErrorHandling;
EXEC @Error = Job1;
IF @Error <> 0
GOTO ErrorHandling;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
RETURN;
ErrorHandling:
IF @@TRANCOUNT > 0
ROLLBACK;
END
z.B. RaiseError
CREATE PROCEDURE Job1
AS
BEGIN
BEGIN TRY
--Do some work
END TRY
BEGIN CATCH
--log error
RAISERROR(ERROR_MESSAGE(), ERROR_SEVERITY(), ERROR_STATE());
END CATCH
END
CREATE PROCEDURE USP_BatchJob
AS
BEGIN
BEGIN TRANSACTION
BEGIN TRY
EXEC Job1;
EXEC Job1;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK;
END CATCH
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
END
Letzteres scheint mehr zu produzieren, wartbaren code
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wird über Codierung Stil, kann dies zu einem religiösen Thema. Der wesentliche Unterschied zwischen einem return-code und eine exception wird die exception wird auch weiterhin übergeben werden, bis die Kette der Aufrufe.
In der Regel code, die ich Schreibe, verwende ich die return-Werte zurückgeben den status einer gespeicherten Prozedur, die als ein "application error". Wie bei deinem Beispiel, 0 bedeutet Erfolg und alles andere bedeutet Versagen. Immer wenn ich eine gespeicherte Prozedur aufrufen, in echten code, ich habe überprüft, auf die return-Wert als auch keine neuen Fehler entstehen könnten. Durch die Art und Weise, in der SQL Server-Sie können nicht überprüfen Sie für Fehler, die mit "@retval <> 0", da gespeicherte Prozeduren NULL zurückgeben kann.
Natürlich Ausnahmen/Datenbank-Fehler können noch auftreten. Die Idee ist, dass, wenn eine Ausnahme erkannt wird, wird protokolliert und behandelt. Das system "Fehler" verwandelt sich in ein application-Fehler.
Die einzige Frage, die ich sehe, ist die Interaktion mit SQL Server-Agent. Für diese, die Sie wollen, um einen Fehler auszulösen, um "Gabel" um die Fehlerbehandlung Schritt. Dies geschieht ganz einfach in einem job-step, indem man die return-Wert und dann einen Fehler zu erzeugen.
NULL
, aber wenn die gespeicherte Prozedur fehlschlägt, ist der Rückgabewert erkannt, dass der Aufrufer istNULL
. Oder, wenn die gespeicherte Prozedur hat keinereturn
- Anweisung.