2011-03-05 34 views
1

我有(tableA)帶有一個標識字段(ID),我需要一次插入多個行並插入一個操作,所以我使用表結構作爲存儲過程的傳遞參數批量插入返回無序標識字段

我需要插入的順序插入ID所以我在我的SP運行下面的查詢 (tableB的具有相同結構的表A):

CREATE PROCEDURE ssp_Test 
(
    tableA tableAType 
) 
AS 
BEGIN 

INSERT INTO tableB(field1, field2, ...) 
OUTPUT INSERTED.ID 
SELECT field1, field2, ... from tableA 

END 

如果我運行100條記錄以上程序它返回新的標識字段與它插入到tableB的順序,但是當我用500條記錄運行它時,全部in沒有合理的順序,爲什麼會發生這種情況?

我不需要另外一個臨時表把它放在那裏,那種和回報,我只是想知道爲什麼它的發生,是有不使用額外的臨時表進行排序的任何解決方案?

回答

1

看看這篇文章,因爲聚集索引)值: http://technet.microsoft.com/en-us/library/ms177564.aspx

它指出: 「有不保證更改應用於表的順序以及將行插入到輸出表或表變量中的順序將對應。「

我建議在插入後使用select來檢索ID 。

+0

是它僅適用於輸出結果或實際的插入操作是不可靠的,首先記錄先插入。 – Ehsan 2011-03-06 05:14:01

+0

OUTPUT結果,插入應該按照select的順序完成。 (嘗試通過您的選擇添加訂單)。 – Bravax 2011-03-06 10:34:41

3

如果你想訂購的東西,你必須使用一個ORDER BY子句。有沒有試圖依靠一個物理順序(即使你認爲你知道一個存在(即

3

在基因拉爾,有沒有這樣的事,作爲一個有序 INSERT,但SQL Server不支持指定其中IDENTITY值由操作分配秩序的一種方式。此保證僅適用於插入表,僅適用於INSERT ... SELECT(不是SELECT INTO),並且沒有說明存儲引擎實際執行行插入的'順序'。

如果你需要在一個特定的順序分配標識值,爲了返回產生標識值,你可以使用一個表變量與OUTPUT子句:


-- New data values 
DECLARE @Data 
TABLE (
     some_value BIGINT NOT NULL 
     ) 
; 
-- Table to be inserted to 
DECLARE @Destination 
TABLE (
     row_id INTEGER IDENTITY PRIMARY KEY CLUSTERED, 
     data BIGINT NOT NULL 
     ) 
; 
-- Table to hold IDs generated 
DECLARE @IDs 
TABLE (
     row_id INTEGER NOT NULL PRIMARY KEY CLUSTERED 
     ) 
; 
-- Sample new data values to add to destination 
INSERT @Data 
VALUES (1001), (996), (108), (250), (2000) 
; 
-- Do the insert, assign identity values 
-- in the order of values going in, 
-- and save the IDs generated in @IDs 
INSERT @Destination (data) 
OUTPUT inserted.row_id 
INTO @IDs (row_id) 
SELECT D.some_value 
FROM @Data AS D 
ORDER BY 
     D.some_value ASC 
; 
-- Return the IDs in a particular order 
SELECT I.row_id 
FROM @IDs AS I 
ORDER BY 
     I.row_id ASC 
; 

欲瞭解更多信息,請參閱:Ordering Guarantees in SQL ServerNo Seatbelt - Expecting Order without ORDER BY

+0

謝謝保羅。我們發現這種確切的情況正在發生。我們批量插入數據並將其返回給.NET。要注意的令人困惑的事情是,通過影響的順序插入,但不會控制輸出次序 我們整理那裏返回的行,我們的問題解決了! – lukem 2013-07-04 02:06:49

0

要使用數字序列填充列,請使用ROW_NUMBER()(或SQL Server 2012中的序列)。不要試圖依賴IDENTITY列,因爲它的行爲不能總是被控制。