4

我有一个有两列的表:

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

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

DECLARE @idsMap TABLE (OriginalId int, NewId int)

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

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.

相关问题:
使用select的SQL插入可以返回多个身份吗?
可以使用表参数插入,还可以检索标识值吗?

4

2 回答 2

5

可以使用MERGE INTOand来实现OUTPUT

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;
于 2014-07-14T07:23:49.450 回答
1

向 MyTable 添加一个新列怎么样?只要您需要分析或其他任何内容,您就可以保留它。我不得不说创建表格的副本对我来说似乎有点不对劲,但这取决于你自己的决定。

像这样的东西可能对你有用。

alter table MyTable
add OldID int null;

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

select * from MyTable
于 2014-07-10T14:44:42.123 回答