0

我有这些表(为清楚起见进行了简化):

TABLE CHANGES
ChangeID  bigint
MemberID  varchar(10)
ChangedOn smalldatetime

TABLE FIELDCHANGES
ChangeID  bigint
FieldName varchar(30)
OldValue  varchar(100)
NewValue  varchar(100)

为了跟踪对成员所做的更改 ( MemberID)。

我想要做的是 中INSERT的记录CHANGES,SQL 为列生成顺序值(通过使用IsIdentity),ChangeID然后使用该值和其他详细信息INSERT生成记录。FIELDCHANGES现在,我可以INSERT,然后SELECT是最新记录MemberID,但我想知道是否有一种有效的方法来执行此操作,例如 SQL 在执行此操作时返回ChangeID列的值INSERT

4

2 回答 2

4

要获取最近插入的标识列的标识值,请使用SELECT SCOPE_IDENTITY()

范围特定于存储过程、脚本批处理、函数或触发器。

于 2013-08-23T20:20:59.350 回答
2

在插入中使用该OUTPUT子句。这是首选方法,因为它允许您插入多条记录并仍然获取所有身份。Scope_identity只会返回一条记录。此外,scope_identity打开并行性时会出现一些问题。( http://support.microsoft.com/kb/2019779 ) 如果您不使用并行性并且您只会插入一条记录,scope_identity则可以使用。

还有其他两种方法可以获取返回的标识值,但在此用例中,您不应该在任何情况下使用它们。@@identity将从您所在的范围返回最后一个身份,这意味着如果表有一个触发器插入到具有身份的表中,那就是您返回的身份。@@identity因为这个用例很可能最终(并且非常偷偷摸摸,因为它有时会在发现问题之前很长一段时间内愉快地使用错误的身份,然后几乎不可能修复)给您带来数据完整性问题,并且永远不应该使用对于这种情况,因为您永远不知道何时可以添加触发器。@@identity之所以危险,正是因为它可能在维护时中断,直到有人抱怨数据完整性不好时才知道它已经损坏。

更糟糕的是ident_current。这将从任何范围内获取最后一个身份,因此如果两个用户同时插入,它可能会向其中至少一个用户返回错误的身份值。这会导致主要的数据完整性问题。的目的ident_current是查看桌子上的最后一个身份是什么;它永远不应该用于插入另一个表。

于 2013-08-23T20:38:24.060 回答