在INSERT上获取标识列值

时间:2012-01-16 06:52:05

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

我正在使用SQL Server 2008创建一个过程。

我使用以下sql语句插入审计表

 insert into  Listuser
 (
   UserID,
   ListID,
   AuditCreated
  )
   select
   UserID,
   ListID,
    GETDATE()
 from  ListUser where Surname='surname'

我使用scope_identity()从listuser表中获取标识列,并将标识列插入另一个日志表

如果select语句包含多于1个值,如何获取两列的标识值并插入到日志表中?

Thanjs

1 个答案:

答案 0 :(得分:12)

如果您需要捕获插入的多个标识值,我将使用OUTPUT子句:

DECLARE @TableOfIdentities TABLE (IdentValue INT)

INSERT INTO dbo.Listuser(UserID, ListID, AuditCreated) 
  OUTPUT Inserted.ID INTO @TableOfIdentities(IdentValue)
  SELECT
      UserID, ListID, GETDATE()
  FROM 
      dbo.ListUser 
  WHERE
      Surname = 'surname'

这会将所有行插入到ListUser表中,并将此INSERT生成的所有标识输出到@TableOfIdentities表变量

Read more about the OUTPUT clause on MSDN

这些值被插入到表变量中,你可以在插入后从那个表变量中选择它们,并做你需要做的任何事情:

SELECT * FROM @TableOfIdentities

更新:这里使用表变量就是一个例子 - 当然你也可以将数据输出到SQL Server中的“普通”表中 - 你也可以输出多个值对于每个插入的行,如果你需要 - 所以你可以有类似的东西:

INSERT INTO dbo.Listuser(UserID, ListID, AuditCreated) 
  OUTPUT Inserted.ID, Inserted.UserID, Inserted.SurName, GETDATE() 
       INTO AuditTable(IdentValue, UserID, Surname, InsertDate)
  SELECT
      UserID, ListID, GETDATE()
  FROM 
      dbo.ListUser 
  WHERE
      Surname = 'surname'