Soulever une erreur manuellement dans T-SQL pour sauter pour commencer le bloc de capture
est-il possible de soulever une erreur dans une procédure stockée manuellement pour arrêter l'exécution et passer au bloc BEGIN CATCH
? Certains analogues de throw new Exception()
dans C#
.
voici le corps de ma procédure stockée:
BEGIN TRY
BEGIN TRAN
-- do something
IF @foobar IS NULL
-- here i want to raise an error to rollback transaction
-- do something next
COMMIT TRAN
END TRY
BEGIN CATCH
IF @@trancount > 0
ROLLBACK TRAN
END CATCH
je sais que d'une manière: SELECT 1/0
Mais c'est affreux!!
5 réponses
vous pouvez utiliser raiserror
. Lire plus de détails ici
--à partir de MSDN
BEGIN TRY
-- RAISERROR with severity 11-19 will cause execution to
-- jump to the CATCH block.
RAISERROR ('Error raised in TRY block.', -- Message text.
16, -- Severity.
1 -- State.
);
END TRY
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
-- Use RAISERROR inside the CATCH block to return error
-- information about the original error that caused
-- execution to jump to the CATCH block.
RAISERROR (@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
);
END CATCH;
EDIT
Si vous utilisez SQL Server 2012+ , vous pouvez utiliser la clause throw
. ici sont les détails.
vous pouvez utiliser THROW
(disponible en SQL Server 2012+):
THROW 50000, 'Your custom error message', 1
THROW <error_number>, <message>, <state>
vous recherchez RAISERROR
.
de MSDN:
génère un message d'erreur et initie erreur de traitement pour la session. RAISERROR peut soit référence à un message défini par l'utilisateur stocké dans le sys.messages catalogue visualisez ou créez un message de façon dynamique. Le message est retourné en tant que serveur message d'erreur à l'appel application ou à une capture associée bloc D'un essai ... CATCH construire.
Codeprojet a un bon article qui décrit également en profondeur les détails de la façon dont il fonctionne et comment l'utiliser.
SQL a un mécanisme d'augmentation d'erreur
RAISERROR ( { msg_id | msg_str | @local_variable }
{ ,severity ,state }
[ ,argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]
il suffit de chercher Raiserror dans les livres en ligne. Mais.. vous devez générer une erreur de la sévérité appropriée, une erreur à la sévérité 0 à 10 ne vous amène pas à sauter au bloc catch.
lancer (Transact-SQL)
soulève une exception et transfère l'exécution à un bloc de capture D'un TRY...CATCH construit dans SQL Server 2017.
, Veuillez consulter le lien ci-dessous