sql - 如何使用OUTPUT捕获新旧ID?

标签 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

我需要从输出中获取旧 ID 和新 ID。但是这个sql给了我错误“无效的列名‘ID’。” http://sqlfiddle.com/#!3/a27b2/1

最佳答案

您不能使用传统的 INSERT 来输出未插入的字段。 请改用合并(警告:仅适用于数据库兼容性 >= 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

关于sql - 如何使用OUTPUT捕获新旧ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13620044/

相关文章:

sql-server - 需要帮助 Local.name(.) xquery 函数

c# - 第一次打开应用程序时应用程序变慢

mysql - 关于重构sql查询

sql - 将多行的列列为行(postgresQL)

sql - 在 mdx 查询中查找每个后续财务周期年份的数据

c# - 无法对 SQL Server Express 2008 使用 SQL Server 身份验证

sql-server-2008 - charindex时的SQL Server案例

iphone - 从网站到 iPhone 应用程序的内容

sql - 我如何在 Firebird 中使用事务?

sql - SQL Server 中联接子查询的效率