22

RAISERROR()の構文意味は何代わりにした後、その構文の下に与えられているトリガー:私はRAISERROR('Cannot Insert where salary > 1000',16,1)私が作成した

使用していた上記の構文で

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)の使用を説明してください。

+0

'RaIsError'の構文は、[here](http://msdn.microsoft.com/en-us/library/ms178592(v = sql.100).aspx)で説明されています。 – HABO

+3

このトリガは壊れています。実際には 'inserted'には0,1、または* many *行が存在するのに対し、' inserted'には* single *行があると仮定しています。 –

答えて

37

これはエラーの重大度です。レベルは11〜20であり、SQLでエラーが発生します。レベルが高ければ高いほど、レベルと取引はより厳しくなります。

あなたが行うときに、構文エラーが発生します。

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

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

あなたは、警告ではなく、例外を発行したいレベル0を使用する場合 - MSDNから10

を:

重症度

は、これに関連するユーザ定義の重大度レベルですメッセージ。 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/321903

+0

お返事ありがとうございます。私の考え方はクリアされましたが、RAISERROR()の3番目のパラメータである州の背後にあるコンセプトについても説明してください。 – user2289490

+2

@ user2289490 - エラーが発生した場所を特定するために使用できます。私。ステート1でエラーを発生し、別のエラー(ストアドプロシージャの別の部分で)を発生させた場合は、プロシージャのどの部分が例外をスローしたかをトレースできます。 –

8

MSDN

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

16に係る重症度あろう。
1は状態になります。

エラーは、RAISEERROR機能に必要なパラメータを適切に入力していないためです。

11

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

3

重大度レベルからのより多くの例に従い、試してみることができますサンプルコードの16は、通常、ユーザー定義の(ユーザーが検出した)エラーに使用されます。 SQL Server DBMS自体は、それが検出された問題のためにseverity levels(およびエラーメッセージ)を発行します。重大度は高くなりますが、数値は低くなります。

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

関連する問題