【问题标题】:Value of SCOPE_IDENTITY on bulk insert批量插入时 SCOPE_IDENTITY 的值
【发布时间】:2014-11-28 14:25:55
【问题描述】:

我有一张桌子MyTable,我在这张桌子上有一张After trigger(On Insert)

当我在 MyTable 上运行批量插入语句时,它会触发触发器来捕获插入的数据(即用于审计日志目的)。

我们已经截断了表 MyTable,现在在表中插入了 5 条以下的记录。此外,Auditlog 表具有现有数据。假设审计日志表中已有 500 条记录。

我的问题是,当表上有触发器时,SCOPE_IDENTITY() 在表上的BULK INSERT 语句会返回什么?

--Create table 
Create table MyTable 
(
    FirstCol int identity(1,1) primary key,
    SecondCol varchar(10)
)

Create table AuditLog
(
    AID int identity(1,1) primary key,
    Comments varchar(50)
)

--Insert data to MyTable
INSERT INTO MyTable (SecondCol)
VALUES ('First'), ('Second'), ('Third'), ('Fourth'), ('Fifth')

Select * from MyTable
Select Scope_identity()  

【问题讨论】:

  • 最后一个查询返回了什么?
  • 到目前为止我还没有创建触发器,但我想知道在上述情况下 scope_identity 会返回什么。我知道 scope_identity 返回最后一个值,但在批量插入的情况下,行为会改变吗?

标签: sql sql-server sql-server-2008


【解决方案1】:

scope_identity 返回同一范围内最后创建的 id。触发器在单独的范围内运行,因此该函数将返回与触发器不存在相同的内容。

【讨论】:

  • 你的意思是在我的情况下 scope_identity 会返回 5 还是会返回 505?
  • @PareshJ:您将从插入在同一范围内的最后一条记录中获取 id,因此这将是插入在 MyTable 中的最后一条记录的 5。
  • 请回答两个问题。 (1) 所以你的意思是,如果我在触发器中写 Select Scope_identity,它会返回 505 而不是 5。(2) 如果我在触发器中使用 @@Identity,它仍然会返回 5。我说的对吗??
  • @PareshJ: 1) 是的,在触发器中,scope_identity 函数将返回在该范围内创建的 id,即AuditLog 表。 2)如果您使用@@identity,它将返回当前会话(连接)在任何范围内创建的最后一个id,因此在触发器中它将返回5(来自MyTable),然后您将最后一条记录插入AuditLog , 和 505 之后。
【解决方案2】:
    --Temp Table to Get Result     
    DECLARE @OutputTbl TABLE (ID INT)
    --Insert data to MyTable
    INSERT INTO MyTable (SecondCol)
    --Get Result in "INSERTED" Table 
    OUTPUT INSERTED.FirstCol INTO @OutputTbl(ID)
    VALUES ('First'), ('Second'), ('Third'), ('Fourth'), ('Fifth')
    select * from @OutputTbl
    select * from MyTable 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    相关资源
    最近更新 更多