我有一个问题描述如下:我有一个表而不是插入触发器:
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时,它返回Null for SCOPE_IDENTITY()而不是表的标识。我甚至在proc中的insert语句中尝试了Output子句。但是,在这种情况下,从Output子句中插入填充的输出表Identity字段再次为0。
任何帮助将不胜感激。
答案 0 :(得分:1)
嗯,你在那里得到了很多腌菜
一方面,您需要在表上使用instead of insert
触发器,但另一方面,您希望将此触发器生成的标识返回到激活它的存储过程。
由于无法向触发器发送参数,因此您必须执行以下三项操作之一:
找到一些方法来消除对它的需要而不是触发器 这是我最好的建议。
将存储过程分为两部分:一部分将执行所有操作,直到insert into
语句(包括它),从而激活instead of insert
触发器,另一部分将完成所有操作触发后需要的操作。这样,您可以使用scope_identity()
触发器中的instead of insert
并将其返回值作为参数发送到第二个存储过程。
注意:此设计意味着您必须逐个插入记录。如果您尝试插入多条记录,scope_identity()
将仅返回触发器插入的最后一行的标识。
答案 1 :(得分:-1)
SCOPE_IDENTITY()从当前作用域返回值,并且存储过程在存储过程外部,它将为null.use @@ identity以获取最后插入的标识。