2017-02-12 17 views
0

我有目標表和一個臨時表,例如:如何將多行插入到表中並按順序獲取所有新的標識值?

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 

什麼是獲取新創建的標識值,並保持了與我原來的順序正確的做法?

+0

trackingId值是否唯一? –

+0

@ZoharPeled - 是的,這就是我添加它的原因。其他值不是唯一的(實際上,大約20列)。 – Kobi

+0

我沒看到問題。 「INSERT INTO SELECT ... ORDER BY」完成這項工作。 SQL Server不保證順序,這就是爲什麼你使用'ORDER BY'後,你的數據按你想要的方式。並且將按照該順序插入 –

回答

1

是的。該插入將始終有效,一旦包含了該命令,插入將按該順序執行。

在這裏,我改變分期秩序,順便說一句,你不需要OUTPUT

SQL DEMO

insert #Staging (TrackingId, Value) values (201,1000),(204,2000),(203,2000),(202,1000); 
              ^  ^  ^  ^

INSERT INTO #Target (Value <, otherfields>) 
SELECT TrackingID <, otherfields> 
FROM #Staging 
ORDER BY TrackingID 
; 


SELECT * 
FROM #Target; 

請那篇文章the answer from the author在閱讀下面的意見:

  • 你能否詳細說明在陳述#4上。

是,標識值將由ORDER BY建立序列中生成的。如果標識列上存在聚簇索引,則這些值將按照索引鍵的邏輯順序。這仍然不能保證插入的物理順序。索引維護是一個不同的步驟,例如也可以並行完成。因此,您最終可以根據ORDER BY子句生成標識值,然後將這些行提供給將執行維護任務的聚集索引插入運算符。你可以在查詢計劃中看到這一點。你不應該考慮物理操作或命令,而應該將表看作無序的一組行。該索引可用於以邏輯方式(使用ORDER BY子句)有效地對行進行排序。

+0

雖然缺少指向文章的鏈接...很好的答案。 –

+1

使用'INSERT ... SELECT'分配的身份值序列由SQL Server聯機叢書(https://msdn.microsoft.com/zh-cn/library/ms174335.aspx)中記錄的ORDER BY確定, 。這與目標表上的索引無關,因爲根據定義,表在邏輯上是無序的一組行。 –

+0

@ZoharPeled這篇文章在OP問題中被鏈接。 –

相關問題