我有一个描述如下的问题:我有一个包含一个而不是插入触发器的表:
create table TMessage (ID int identity(1,1), dscp varchar(50))
GO
Alter trigger tr_tmessage on tmessage
instead of insert
as
--Set NoCount On
insert into tmessage
select dscp from inserted
GO
Alter proc P1
As
--Set NoCount On
insert into tmessage
(dscp)
values('some data')
Select SCOPE_IDENTITY()
GO
当我执行P1时,它将为SCOPE_IDENTITY()返回Null而不是表的标识。我什至在proc的insert语句中尝试了Output子句。但是在这种情况下,通过从Output子句中插入来填充的输出表Identity字段再次为0。
任何帮助,将不胜感激。
好吧,你在那里泡菜了。
一方面,您需要instead of insert
表上的触发器,但另一方面,您想让该触发器生成的标识返回到激活它的存储过程。
由于无法在触发器之间发送参数,因此您必须做以下三件事之一:
寻找某种方法来消除对触发器的需求。
这是我最好的建议。
将存储过程分为两部分:一部分将执行所有操作,直到insert into
语句(包括它)为止,从而激活instead of insert
触发器,另一部分将执行触发器之后所需的所有操作。这样,您可以scope_identity()
在instead of insert
触发器内部使用并将其返回值作为参数发送到第二个存储过程。
注意:这种设计意味着您必须一个一个地插入记录。如果您尝试插入多条记录,scope_identity()
则只会返回触发器插入的最后一行的标识。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句