如何通过插入触发器来插入表标识?

时间:2015-05-14 07:52:07

标签: sql-server triggers

我有一个问题描述如下:我有一个表而不是插入触发器:

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。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

嗯,你在那里得到了很多腌菜 一方面,您需要在表上使用instead of insert触发器,但另一方面,您希望将此触发器生成的标识返回到激活它的存储过程。

由于无法向触发器发送参数,因此您必须执行以下三项操作之一:

  1. 找到一些方法来消除对它的需要而不是触发器 这是我最好的建议。

  2. 将存储过程分为两部分:一部分将执行所有操作,直到insert into语句(包括它),从而激活instead of insert触发器,另一部分将完成所有操作触发后需要的操作。这样,您可以使用scope_identity()触发器中的instead of insert并将其返回值作为参数发送到第二个存储过程。
    注意:此设计意味着您必须逐个插入记录。如果您尝试插入多条记录,scope_identity()将仅返回触发器插入的最后一行的标识。

  3. 找到一些在存储过程和而不是触发器之间传递数据的方法。由于触发器不能除了或返回参数,因此您必须使用临时表或常规表。建议的解决方案仅作为最后的手段,因为它会使您的代码复杂化,并可能导致一些性能问题。此外,您必须找到一种方法来执行存储过程,直到触发器代替触发器完成它的工作。我可以给你一些关于如何在程序和触发器之间共享数据的指示,但我真的建议你不要选择这个解决方案。

答案 1 :(得分:-1)

SCOPE_IDENTITY()从当前作用域返回值,并且存储过程在存储过程外部,它将为null.use @@ identity以获取最后插入的标识。