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

文章翻譯 文章翻譯
文章編號: 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 	NewTable
FROM 	OldTable
Order By Col1
NewTable 可能插入具有下列之一的資料列的兩種方式。 一個 ORDER BY 子句。

方法 1

Col1      Col2       ID
-------   --------   --------
1         A          4
2         Z          2
7         G          5
11        F          3
17        I          1
您可能會注意到該 IDENTITY 值,SQL Server 會產生不在相同的順序為 ORDER BY 欄 (欄 1) 在查詢中。

方法 2

Col1     Col2       ID
-------  --------   -------
1        A          1
2        Z          2
7        G          3
11       F          4
17       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 NewTable
FROM OldTable
Order By Col1
-
SET ROWCOUNT 3
SELECT Col1, Col2, ID=IDENTITY (int, 1, 1)
INTO NewTable
FROM OldTable
Order By Col1
NewTable 可能插入具有下列之一的資料列的三個可能的方法: 一個 SET ROWCOUNT 陳述式。

方法 1

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

方法 2

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

方法 3

Col1   Col2    ID
------ ------  ------
1      A       4
2      Z       2
7      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        I
2         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         S
2                2         z
3                7         G
4                11        F
5                17        I

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

屬性

文章編號: 273586 - 上次校閱: 2007年11月2日 - 版次: 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
關鍵字:?
kbmt kbhowto kbinfo kbpending KB273586 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:273586
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com