web-dev-qa-db-fra.com

Générer une erreur manuellement dans T-SQL pour passer au bloc BEGIN CATCH

Est-il possible de déclencher manuellement une erreur dans une procédure stockée pour arrêter l'exécution et passer au bloc BEGIN CATCH? Un analogue 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 connais une façon: SELECT 1/0 Mais c'est affreux !!

35
abatishchev

vous pouvez utiliser raiserror. Lire plus de détails ici

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

[~ # ~] modifier [~ # ~] Si vous utilisez SQL Server 2012+, vous pouvez utiliser la clause throw. Ici sont les détails.

66
TheVillageIdiot

Vous pouvez utiliser THROW (disponible dans SQL Server 2012+):

THROW 50000, 'Your custom error message', 1
THROW <error_number>, <message>, <state>

LANCEMENT MSDN (Transact-SQL)

Différences entre RAISERROR et THROW dans Sql Server

13
Jim Aho

Vous recherchez RAISERROR .

Depuis MSDN:

Génère un message d'erreur et lance le traitement des erreurs pour la session. RAISERROR peut référencer un message défini par l'utilisateur stocké dans la vue de catalogue sys.messages ou créer un message de manière dynamique. Le message est renvoyé en tant que message d'erreur de serveur à l'application appelante ou à un bloc CATCH associé d'une construction TRY… CATCH.

CodeProject a un bon article qui décrit également en détail les détails de son fonctionnement et de son utilisation.

2
Donut

SQL dispose d'un mécanisme de génération d'erreur

RAISERROR ( { msg_id | msg_str | @local_variable }
{ ,severity ,state }
[ ,argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]

Recherchez Raiserror dans la documentation en ligne. Mais .. vous devez générer une erreur de la gravité appropriée, une erreur de gravité 0 à 10 ne vous fait pas sauter au bloc catch.

2
Andrew

JETER (Transact-SQL)

Déclenche une exception et transfère l'exécution vers un bloc CATCH d'une construction TRY… CATCH dans SQL Server 2017.

Veuillez vous référer au lien ci-dessous

exception de lancement T-SQL

1
sof_user