Es sollte darauf hingewiesen werden, dass Sie dies (höchstwahrscheinlich) nicht tun möchten , selbst wenn es technisch möglich wäre, zwischen THROW
und zu wechseln RAISERROR
. Warum? Da die sehr geschickte Fähigkeit des parameterlos , THROW
um den Fehler wieder wirft die Verwendung derselben Meldungsnummer (dh Msg 8134
statt , Msg X
wo X
> = 50000) ist nicht der einzige Unterschied zwischen ihnen: THROW
chargen Abbruch während RAISERROR
nicht. Dies kann ein wichtiger Verhaltensunterschied sein, wie unten gezeigt.
Versuchsaufbau
--DROP PROC ##Throw;
--DROP PROC ##RaisError;
GO
CREATE PROCEDURE ##Throw
AS
SET NOCOUNT ON;
BEGIN TRY
SELECT 1/0 AS [DivideByZero];
END TRY
BEGIN CATCH
THROW;
END CATCH;
SELECT 1 AS [AA];
GO
CREATE PROCEDURE ##RaisError
AS
SET NOCOUNT ON;
BEGIN TRY
SELECT 1/0 AS [DivideByZero];
END TRY
BEGIN CATCH
RAISERROR('test, yo!', 16, 1);
-- RETURN; -- typically at end of CATCH block when using RAISERROR
END CATCH;
SELECT 2 AS [BB];
GO
Test 1
EXEC ##Throw;
SELECT 3 AS [CC];
Kehrt zurück:
"Results" Tab:
DivideByZero
{empty result set}
"Messages" Tab:
Msg 8134, Level 16, State 1, Procedure ##Throw, Line 38
Divide by zero error encountered.
Test 2
EXEC ##RaisError;
SELECT 4 AS [DD];
Kehrt zurück:
"Results" Tab:
DivideByZero
{empty result set}
BB
2
DD
4
"Messages" Tab:
Msg 50000, Level 16, State 1, Procedure ##RaisError, Line 45
test, yo!
Um fair zu sein, ist es möglich, diesen Unterschied zu maskieren, indem Sie Folgendes tun:
- Immer wickelt alle Anrufe unter Verwendung von Code
THROW
innerhalb eines TRY...CATCH
Konstrukts (demonstrierte unten)
- Setzen Sie niemals Code nach dem
THROW
(naja, außer END CATCH;
)
Test 3
BEGIN TRY
EXEC ##Throw;
SELECT 5 AS [EE];
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS [ErrorNumber], ERROR_MESSAGE() AS [ErrorMessage];
END CATCH;
SELECT 6 AS [FF];
GO
Kehrt zurück:
"Results" Tab:
DivideByZero
{empty result set}
ErrorNumber ErrorMessage
8134 Divide by zero error encountered.
FF
6
Test 4
BEGIN TRY
EXEC ##RaisError;
SELECT 7 AS [GG];
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS [ErrorNumber], ERROR_MESSAGE() AS [ErrorMessage];
END CATCH;
SELECT 8 AS [HH];
GO
Kehrt zurück:
"Results" Tab:
DivideByZero
{empty result set}
ErrorNumber ErrorMessage
50000 test, yo!
HH
8