シンタックスが以下に示されている代わりに、代わりにトリガーを作成しました。
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)の使用を説明できますか?.
エラーの重大度です。レベルは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より大きい値はエラーを生成します。同じユーザー定義エラーが複数の場所で発生した場合、各場所に一意の状態番号を使用すると、コードのどのセクションでエラーが発生しているかを見つけるのに役立ちます。
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 から他の例をフォローして試すことができます。
MSDN に従って
RAISERROR ( { msg_id | msg_str | @local_variable }
{ ,severity ,state }
[ ,argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]
16
は重大度です。1
が状態になります。
表示されるエラーは、RAISEERROR
関数に必要なパラメーターを適切に指定していないためです。
サンプルコードの重大度レベル16は、通常、ユーザー定義(ユーザー検出)エラーに使用されます。 SQL Server DBMS自体は、検出した問題に対して、より深刻な(数値が大きい)とそれほど深刻ではない(数値が小さい)の両方で、 重大度 (およびエラーメッセージ)を出力します。
状態は0〜255の整数でなければなりません(負の値はエラーになります)が、基本的にはプログラマーが選択します。ユーザー定義エラーの同じエラーメッセージが異なる場所で発生する場合、異なる状態値を入力すると便利です。エラーの発生場所をさらに示すことで、問題のデバッグ/トラブルシューティングを支援する場合。