web-dev-qa-db-ja.com

RAISERROR()の構文の意味は何ですか

シンタックスが以下に示されている代わりに、代わりにトリガーを作成しました。

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

上記の構文では、RAISERROR('Cannot Insert where salary > 1000',16,1)を使用しました

しかし、RAISERROR('Cannot Insert where salary > 1000')と書くと、同じ行に「 ')'に近い構文が間違っています」というエラーが表示されます。

誰でもここで(16,1)の使用を説明できますか?.

38
user2289490

エラーの重大度です。レベルは11-20で、SQLでエラーがスローされます。レベルが高いほど、レベルは厳しくなり、トランザクションを中止する必要があります。

実行すると、構文エラーが発生します。

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

正しいパラメーター(重大度レベルまたは状態)を指定していないため。

例外ではなく警告を発行する場合は、レベル0〜10を使用します。

MSDNから:

厳しさ

このメッセージに関連付けられているユーザー定義の重大度レベルです。 msg_idを使用して、sp_addmessageを使用して作成されたユーザー定義メッセージを生成する場合、RAISERRORで指定された重大度は、sp_addmessageで指定された重大度をオーバーライドします。 0〜18の重大度レベルは、どのユーザーでも指定できます。 19〜25の重大度レベルは、sysadmin固定サーバーロールのメンバーまたはALTER TRACE権限を持つユーザーのみが指定できます。重大度レベルが19〜25の場合、WITH LOGオプションが必要です。

状態

0〜255の整数です。負の値または255より大きい値はエラーを生成します。同じユーザー定義エラーが複数の場所で発生した場合、各場所に一意の状態番号を使用すると、コードのどのセクションでエラーが発生しているかを見つけるのに役立ちます。

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

59
Darren

16は重大度、1は状態です。より具体的には、次の例で構文と使用法の詳細を確認できます。

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;

http://msdn.Microsoft.com/en-us/library/ms178592.aspx から他の例をフォローして試すことができます。

25
harsh

MSDN に従って

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

16は重大度です。
1が状態になります。

表示されるエラーは、RAISEERROR関数に必要なパラメーターを適切に指定していないためです。

12
Woot4Moo

サンプルコードの重大度レベル16は、通常、ユーザー定義(ユーザー検出)エラーに使用されます。 SQL Server DBMS自体は、検出した問題に対して、より深刻な(数値が大きい)とそれほど深刻ではない(数値が小さい)の両方で、 重大度 (およびエラーメッセージ)を出力します。

状態は0〜255の整数でなければなりません(負の値はエラーになります)が、基本的にはプログラマーが選択します。ユーザー定義エラーの同じエラーメッセージが異なる場所で発生する場合、異なる状態値を入力すると便利です。エラーの発生場所をさらに示すことで、問題のデバッグ/トラブルシューティングを支援する場合。

5
hardmath