5

たとえば、私が持っているとしましょう、

    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

4

2 に答える 2

13

従来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
于 2012-11-29T06:35:34.720 に答える
1

IDテーブルからの出力と一時テーブルからProductsの新規作成の両方を出力する場合はID INT IDENTITY、その一時テーブルを拡張してProducts.ID列も含める必要があります。

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

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

insert into #tempproduct(OldID, Name)
  OUTPUT INSERTED.[ID], Inserted.OldID INTO @OutputAttributesValues
  select ID, [Name] FROM product 
于 2012-11-29T06:37:56.687 に答える