使用OUTPUT子句从SELECT INSERT语句中检索原始和新标识映射

时间:2014-07-10 14:32:28

标签: sql-server output-clause select-insert

我有一个包含两列的表格:

CREATE TABLE MyTable(
  Id int IDENTITY(1,1) NOT NULL,
  Name nvarchar(100) NOT NULL);

我想使用SELECT INSERT语句复制数据:

INSERT INTO MyTable (Name)
SELECT Name FROM MyTable

这里是trickey部分 - 我想检索原始身份和新身份之间的映射表:

DECLARE @idsMap TABLE (OriginalId int, NewId int)

我知道我想使用OUTPUT clause,但由于某种原因它不起作用:

INSERT INTO MyTable (Name)
OUTPUT t.Id, INSERTED.Id INTO @idsMap (OriginalId, NewId)
SELECT Name FROM MyTable t
-- Returns error The multi-part identifier "t.Id" could not be bound.

相关问题:
can SQL insert using select return multiple identities?
Possible to insert with a Table Parameter, and also retrieve identity values?

2 个答案:

答案 0 :(得分:3)

可以使用MERGE INTOOUTPUT

来实现
MERGE INTO MyTable AS tgt
USING MyTable AS src ON 1=0 --Never match
WHEN NOT MATCHED THEN
INSERT (Name)
VALUES (src.Name)
OUTPUT
    src.Id,
    inserted.Id
INTO @idsMap;

答案 1 :(得分:1)

如何向MyTable添加新列?只要你需要分析或其他什么,你可以保留它。我不得不说创建一个表的副本对我来说似乎有点不对,但这取决于你决定。

这样的事可能适合你。

alter table MyTable
add OldID int null;

INSERT INTO MyTable (Name, OldID)
SELECT Name , Id
FROM MyTable t

select * from MyTable