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

28
demandé sur abatishchev 2009-10-07 16:51:47

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.

56
répondu TheVillageIdiot 2018-03-16 02:18:07

vous pouvez utiliser THROW (disponible en SQL Server 2012+):

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

MSDN THROW (Transact-SQL)

différences entre RAISERROR et THROW in Sql Server

9
répondu Jim Aho 2015-11-11 14:26:25

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.

2
répondu Donut 2009-10-07 12:54:25

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.

2
répondu Andrew 2009-10-07 12:55:26

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

T-SQL Throw Exception

1
répondu sof_user 2017-12-10 20:36:33