我有目標表和一個臨時表,例如:如何將多行插入到表中並按順序獲取所有新的標識值?
create table #Target (Id int not null IDENTITY(1,1),Value int not null)
create table #Staging (TrackingId int not null, Value int not null)
insert #Staging (TrackingId, Value) values (201,1000),(202,1000),(203,2000),(204,2000)
需要注意的是:
- 目標表有標識列。
- 臨時表有一個
TrackingId
列,其中不包括在目標表中的。
我想從我的臨時表中的數據插入到我真正的臺,使得我一直從我#Staging.TrackingId
到新創建的#Target.Id
的映射。我的輸出,在插入後,應該是這樣的:
Id, TrackingId
1, 201
2, 202
3, 203
4, 204
(任何其他映射也是可能的,總部設在其中插入發生的順序)
我想兩件事情。一個是order
-ed insert
,其中output
子句。這看起來整潔,但我不能肯定SQL服務器guarantees順序:
insert into #Target (Value)
OUTPUT inserted.Id --shame ", s.TrackingId" isn't allowed...
select s.Value from #Staging s
order by s.TrackingId
我也使用MERGE
嘗試。這工作,但似乎浪費(又有點啞):
MERGE INTO #Target
USING #Staging AS s
ON 1=2 --dummy condition, we know we want an insert
WHEN NOT MATCHED BY TARGET THEN
INSERT (Value)
VALUES (s.Value)
OUTPUT INSERTED.Id, s.TrackingId
什麼是獲取新創建的標識值,並保持了與我原來的順序正確的做法?
trackingId值是否唯一? –
@ZoharPeled - 是的,這就是我添加它的原因。其他值不是唯一的(實際上,大約20列)。 – Kobi
我沒看到問題。 「INSERT INTO SELECT ... ORDER BY」完成這項工作。 SQL Server不保證順序,這就是爲什麼你使用'ORDER BY'後,你的數據按你想要的方式。並且將按照該順序插入 –