我刚创建了一个替代后触发器,其语法如下:
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)的使用。
答案 0 :(得分:55)
这是错误的严重性级别。级别从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会产生错误。如果是相同的用户定义错误 在多个地点举起,每个地点使用一个唯一的州号 location可以帮助找到代码的哪个部分引发错误。
答案 1 :(得分:22)
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
中的更多示例答案 2 :(得分:12)
根据MSDN
RAISERROR ( { msg_id | msg_str | @local_variable }
{ ,severity ,state }
[ ,argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]
16
将是严重程度
1
将成为州。
您得到的错误是因为您未正确提供RAISEERROR
功能所需的参数。
答案 3 :(得分:5)
示例代码中的严重级别16通常用于用户定义的(用户检测到的)错误。 SQL Server DBMS本身会针对它检测到的问题发出severity levels(和错误消息),包括更严重(更高的数字)和更少(更低的数字)。
状态应该是0到255之间的整数(负值会给出错误),但选择基本上是程序员的。如果在不同的位置引发用户定义的错误的相同错误消息,则放置不同的状态值是有用的,例如,如果通过额外指示错误发生的位置来协助问题的调试/故障排除。
答案 4 :(得分:2)
以Microsoft's MSDN为例对此问题发布的答案很好,但是,如果错误不是来自TRY块,则它不能直接说明错误的出处。我更喜欢此示例,并在CATCH块中对RAISERROR消息进行了非常小的更新,指出错误来自CATCH块。我也在gif中演示了这一点。
BEGIN TRY
/* RAISERROR with severity 11-19 will cause execution
| to jump to the CATCH block.
*/
RAISERROR ('Error raised in TRY block.', -- Message text.
5, -- Severity. /* Severity Levels Less Than 11 do not jump to the CATCH block */
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 ('Caught Error in Catch', --@ErrorMessage, /* Message text */
@ErrorSeverity, /* Severity */
@ErrorState /* State */
);
END CATCH;