web-dev-qa-db-fra.com

Quelle est la signification de la syntaxe de RAISERROR ()

Je viens de créer un déclencheur Au lieu après dont la syntaxe est donnée ci-dessous:

Create trigger tgrInsteadTrigger on copytableto
Instead of Insert as 
    Declare @store_name varchar(30);
    declare @sales int;
    declare @date datetime;

    select @store_name = i.store_name from inserted i
    select @sales = i.sales from inserted i
    select @date = i.Date from inserted i
begin
    if (@sales > 1000)
        begin
        RAISERROR('Cannot Insert where salary > 1000',16,1); ROLLBACK;
        end
    else
        begin
        insert into copytablefrom(store_name, sales, date) values (@store_name, @sales, @date);
        Print 'Instead After Trigger Executed';
        end
End

Dans la syntaxe ci-dessus, j'ai utilisé RAISERROR('Cannot Insert where salary > 1000',16,1)

Mais lorsque j'écris RAISERROR('Cannot Insert where salary > 1000'), l'erreur "Syntaxe incorrecte près de ')'" apparaît sur la même ligne.

Quelqu'un peut-il s'il vous plaît expliquer l'utilisation de (16,1) ici.

38
user2289490

C'est le niveau de gravité de l'erreur. Les niveaux vont de 11 à 20, ce qui génère une erreur en SQL. Plus le niveau est élevé, plus le niveau est grave et la transaction doit être abandonnée.

Vous obtiendrez l'erreur de syntaxe quand vous ferez:

RAISERROR('Cannot Insert where salary > 1000').

Parce que vous n'avez pas spécifié les paramètres corrects (niveau de gravité ou état).

Si vous souhaitez émettre un avertissement et non une exception, utilisez les niveaux 0 à 10.

De MSDN:

gravité

Le niveau de gravité défini par l'utilisateur est-il associé à ce message? Lorsque vous utilisez msg_id pour générer un message défini par l'utilisateur créé à l'aide de sp_addmessage, la gravité spécifiée dans RAISERROR remplace la gravité spécifiée dans sp_addmessage. Les niveaux de gravité de 0 à 18 peuvent être spécifiés par tout utilisateur. Les niveaux de gravité de 19 à 25 ne peuvent être spécifiés que par les membres du rôle de serveur fixe sysadmin ou par les utilisateurs disposant des autorisations ALTER TRACE. Pour les niveaux de gravité de 19 à 25, l'option WITH LOG est requise.

etat

Est un entier compris entre 0 et 255. Les valeurs négatives ou les valeurs supérieures à 255 génèrent une erreur. Si la même erreur définie par l'utilisateur est générée à plusieurs emplacements, l'utilisation d'un numéro d'état unique pour chaque emplacement peut aider à trouver la section de code générant les erreurs.

http://support.Microsoft.com/kb/3219

59
Darren

16 est severity et 1 is state, plus précisément l'exemple suivant peut vous donner plus de détails sur la syntaxe et l'utilisation:

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;

Vous pouvez suivre et essayer d'autres exemples de http://msdn.Microsoft.com/en-us/library/ms178592.aspx

25
harsh

selon MSDN

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

16 serait la sévérité.
1 serait l'état.

L'erreur que vous obtenez est due au fait que vous n'avez pas correctement fourni les paramètres requis pour la fonction RAISEERROR.

12
Woot4Moo

Le niveau de gravité 16 de votre exemple de code est généralement utilisé pour les erreurs définies par l'utilisateur (détectées par l'utilisateur). Le SGBD SQL Server lui-même émet niveaux de gravité (et des messages d'erreur) pour les problèmes qu'il détecte, qu'ils soient plus graves (nombres plus élevés) ou moins (nombres plus bas).

L'état doit être un entier compris entre 0 et 255 (les valeurs négatives donneront une erreur), mais le choix est fondamentalement celui du programmeur. Il est utile de définir des valeurs d'état différentes si le même message d'erreur pour une erreur définie par l'utilisateur doit être généré à des emplacements différents, par exemple. si le débogage/dépannage des problèmes sera facilité par une indication supplémentaire de l'endroit où l'erreur s'est produite.

5
hardmath