INSERT
将数据加载到具有IDENTITY
列的表中的语句保证以ORDER BY
与SELECT
.
如果您希望按照 ORDER BY 子句中的顺序以顺序方式分配 IDENTITY 值,请创建一个包含具有 IDENTITY 属性的列的表,然后运行 INSERT .. SELECT ... ORDER BY 查询来填充此表.
From:与 SELECT INTO 或 INSERT 一起使用时 IDENTITY 函数的行为 .. 包含 ORDER BY 子句的 SELECT 查询
您可以使用此事实将您的旧身份值与新身份值相匹配。首先收集您打算复制到临时表中的主键列表。如果需要,您还可以包含修改后的列值:
select
PrimaryKey,
Col1
--Col2... etc
into #NewRecords
from Table
--where whatever...
然后INSERT
使用OUTPUT
子句将您的新 id 捕获到表变量中:
declare @TableVariable table (
New_ID int not null
);
INSERT INTO #table
(Col1 /*,Col2... ect.*/)
OUTPUT INSERTED.PrimaryKey INTO @NewIds
SELECT Col1 /*,Col2... ect.*/
from #NewRecords
order by PrimaryKey
由于该ORDER BY PrimaryKey
声明,您将保证您的编号将按照与复制记录New_ID
的字段相同的顺序生成。PrimaryKey
现在,您可以通过按 ID 值排序的行号来匹配它们。以下查询将为您提供配对:
select PrimaryKey, New_ID
from
(select PrimaryKey,
ROW_NUMBER() over (order by PrimaryKey) OldRow
from #NewRecords
) PrimaryKeys
join
(
select New_ID,
ROW_NUMBER() over (order by New_ID) NewRow
from @NewIds
) New_IDs
on OldRow = NewRow