當配合 SELECT INTO 或 INSERT IDENTITY 函式的行為包含 ORDER BY 子句的 SELECT 查詢

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

按一下這裡查看此文章的英文版本:273586
本文已封存。本文係以「現狀」提供且不會再更新。
結論
當您使用時 IDENTITY 函式和 ORDER BY 子句的 SELECT INTO 查詢時,就會產生識別值並不保證有相同的順序與所提供的 ORDER BY 子句的順序。 比方說如果 IDENTITY 函式開頭的 1 種子和 1 的遞增量,已排序的結果集中第一個的資料列可能具有不同於 1,值和第二個資料列可能必須比 2,不同的值和行為讓 forth.While 順序可能會出現,如您預期,並不保證成功。TOP 或 SET ROWCOUNT 存在也不保證資料列的順序。

IDENTITY 值被指派跟隨在 ORDER BY 子句中排序以循序方式建立表格,包含有 IDENTITY 屬性的資料行,然後再執行一個 INSERTSELECT … ORDER BY 查詢來擴展這個資料表。
其他相關資訊
所產生的識別值是根據中查詢樹 (顯示計劃) 可能會將它改為最佳化器變更平行查詢計劃或存在的 TOP/SET ROWCOUNT 由於 GetIdentity() 函式的位置而定。 雖然您可能會看到在其中一個 SELECT INTO IDENTITY 函式與 ORDER BY 子句產生中的值的情況下您想要這種行為的順序不保證,並且沒有警告的情況下可能會變更。 下列案例牽涉到一個 SELECT INTO 陳述式和一個 IDENTITY 函式。

請考慮使用下列值命名 OldTable 的資料表。
Col1      Col2-------   --------1         A          11        F 7         G          17        I          2         Z          

案例 1

在這種情況下 SELECT INTO 查詢會使用 IDENTITY 函式,並使用
SELECT	Col1, Col2, ID=IDENTITY (int, 1, 1)INTO 	NewTableFROM 	OldTableOrder By Col1
NewTable 可能插入具有下列之一的資料列的兩種方式。 一個 ORDER BY 子句。

方法 1

Col1      Col2       ID-------   --------   --------1         A          42         Z          27         G          511        F          317        I          1
您可能會注意到該 IDENTITY 值,SQL Server 會產生不在相同的順序為 ORDER BY 欄 (欄 1) 在查詢中。

方法 2

Col1     Col2       ID-------  --------   -------1        A          12        Z          27        G          311       F          417       I          5
在這種情況下您可能會發現 [IDENTITY 值的 SQL Server 產生是在完全相同的順序作為 ORDER BY 欄 (欄 1) 在查詢中。不過,這是巧合,而且不保證您會收到每次執行查詢的順序。

案例 2

下列 SELECT INTO 查詢使用 IDENTITY 函式和 ORDER BY 子句,TOP 運算子或
SELECT TOP 3 Col1, Col2, ID=IDENTITY (int, 1, 1)INTO NewTableFROM OldTableOrder By Col1
-
SET ROWCOUNT 3SELECT Col1, Col2, ID=IDENTITY (int, 1, 1)INTO NewTableFROM OldTableOrder By Col1
NewTable 可能插入具有下列之一的資料列的三個可能的方法: 一個 SET ROWCOUNT 陳述式。

方法 1

Col1   Col2   ID-----  -----  -----1      A      22      Z      17      G      3
在這種情況下您可能會檢查 IDENTITY 值,SQL Server 會產生以作為 ORDER BY 欄 (欄 1) 相同的順序在查詢中。

方法 2

Col1    Col2     ID------  ------   ------1       A        12       Z        27       G        3
在這種情況下您可能會發現 [IDENTITY 值的 SQL Server 產生剛好處於作為 ORDER BY 欄 (欄 1) 在查詢中相同的順序。不過,這是巧合,而且不保證您會收到每次執行查詢的順序。

方法 3

Col1   Col2    ID------ ------  ------1      A       42      Z       27      G       5
在這種情況下 IDENTITY 值,SQL Server 會產生不在相同的順序,作為 ORDER BY 欄 (欄 1) 在查詢中。此外,插入的資料不符合 IDENTITY 函式在查詢中指定的 SEED 和遞增值需求 (SEED = 1 增量 = 1)。

實際上,IDENTITY 函式會產生識別值正確地根據 SEED 和遞增值的參數。不過,識別值產生資料列的排序依據 ORDER BY 子句之前發生。因此,當您使用 TOP 運算子] 或 [SET ROWCOUNT 陳述式,插入結果表格 (NewTable) 中的資料列似乎有不正確的識別值。SQL Server 產生的識別值可能不符合 IDENTITY 函式的 SEED 和遞增值參數。

以下是牽涉到一個 INSERT INTO SELECT FROM 與 ORDER BY 子句的範例。

請考慮使用下列值命名 OldTable 的資料表:
Col1      Col2-------   --------1         S          11        F 7         G          17        I2         z


目標資料表下面命名 NewTable (識別碼是一個識別資料行)
ID (identity)    Col1     Col2---------------    -------   ------


下列 INSERT INTO SELECT FROM 查詢與 ORDER BY 子句會保證在 NewTable 識別碼位於相同的順序為 欄 1 該資料行。
INSERT INTO NewTable (Col1, Col2) SELECT Col1, Col2 FROM OldTable ORDER BY Col1 
ID (identity)    Col1     Col2-------------    ------   ------1                1         S2                2         z3                7         G4                11        F5                17        I

附註識別碼識別資料行就會產生具有相同的順序的 欄 1。然而,INSERT INTO doesn’t 保證的識別碼] 或 [欄 1NewTable 實體的順序。若要擷取資料以所要的順序,ORDER BY 子句就必須依照下列的 SELECT 陳述式所示:
SELECT * from NewTable ORDER BY ID
@ @ 的識別身分 sql 排序順序選取插入

警告:本文為自動翻譯

內容

文章識別碼:273586 - 最後檢閱時間:12/05/2015 21:44:34 - 修訂: 4.2

Microsoft SQL Server 7.0 Standard Edition, Microsoft SQL Server 2000 Desktop Engine (Windows), Microsoft SQL Server 2000 Developer Edition, Microsoft SQL Server 2000 Enterprise Edition, Microsoft SQL Server 2000 Personal Edition, Microsoft SQL Server 2000 Standard Edition

  • kbnosurvey kbarchive kbmt kbhowto kbinfo kbpending KB273586 KbMtzh
意見反應