【发布时间】:2014-07-10 14:32:28
【问题描述】:
我有一个包含两列的表格:
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 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?
【问题讨论】:
-
“名称”字段中的值是唯一的还是有重复项?意思是,在通过此查询复制它们之前,它们是唯一的。显然,一旦此 INSERT 运行,它们将不再是唯一的。
-
什么版本的 SQL Server?如果是 2008 年或以后,您可以使用
MERGE技巧,通过查看相关问题很容易找到这里。 -
@srutzky,为了清楚起见,这里的问题被简化了。我不能确定数据是唯一的,即使它是唯一的,我也不想运行另一个查询,因为索引不是......我怎么能温和地说......不是最佳的。
-
@Damien_The_Unbeliever,我不熟悉你所说的
MERGE。是不是有点像UPSERT?如何将其应用于此问题? -
@HuBeZa - 请参阅此related question 上最不被接受的答案。是的,它是
UPSERT。你安排它实际上总是INSERT,但你可以在OUTPUT子句中访问源表,这与INSERT语句不同。
标签: sql-server output-clause select-insert