如何使用OUTPUT捕获新旧ID?

use*_*567 4 sql sql-server sql-server-2008

比如说我有,

    create table product
    (
      ID INT IDENTITY(1,1) NOT NULL,
      Name VARCHAR(10)
    )

    insert into product(Name) values('a')
    insert into product(Name) values('b')
    insert into product(Name) values('c')
    insert into product(Name) values('d')
    insert into product(Name) values('e')

    create table #tempproduct
    (
      ID INT IDENTITY(1,1) NOT NULL,
      Name VARCHAR(10)
    )

    declare @OutputAttributesValues table
    (
      [NewID] INT, 
      [OldID] INT
    )

    insert into #tempproduct(Name)
    OUTPUT INSERTED.[ID],[ID] INTO @OutputAttributesValues
    select [Name] FROM product
Run Code Online (Sandbox Code Playgroud)

请参阅我需要从输出中获取旧ID和新ID.但是这个sql给了我错误"无效的列名'ID'." http://sqlfiddle.com/#!3/a27b2/1

YS.*_*YS. 11

您不能使用传统INSERT输出非插入字段.改为使用merge(要点:仅适用于数据库兼容性> = 100):

MERGE
  #tempproduct AS t
USING(
  SELECT
      Name
      , ID
  FROM
    product) AS s
ON (1=0)  
WHEN NOT MATCHED   
  THEN INSERT (Name) VALUES (Name)
OUTPUT inserted.ID, s.ID INTO @OutputAttributesValues;

SELECT * FROM @OutputAttributesValues
Run Code Online (Sandbox Code Playgroud)