Das Verhalten der IDENTITY-Funktion mit SELECT INTO oder INSERT SELECT-Abfragen, die eine ORDER BY-Klausel enthalten

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 273586 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

Wenn Sie mit der IDENTITY -Funktion und eine ORDER BY-Klausel eine SELECT INTO-Abfrage verwenden, werden die Identitätswerte, die generiert werden, nicht unbedingt dieselbe Reihenfolge wie die Reihenfolge verfügen, die durch die ORDER BY-Klausel bereitgestellt wird. Beispielsweise wenn die IDENTITY -Funktion mit einem Ausgangswert von 1 und eine Schrittweite 1 gestartet wird, könnte die erste Zeile in dem sortierten Resultset einen anderen Wert als 1, verfügen und die zweite Zeile haben möglicherweise einen anderen Wert als 2 und damit forth.While die Reihenfolge angezeigt werden kann, wie gewünscht, wird das Verhalten ist nicht gewährleistet. Das Vorhandensein von TOP oder SET ROWCOUNT wird die Reihenfolge der Zeilen auch nicht garantiert.

Wenn Sie möchten die IDENTITY -Werte in einer sequenziellen Weise zugewiesen werden, die die Reihenfolge in der ORDER BY-Klausel folgt, erstellen Sie eine Tabelle, die mit enthält eine Spalte mit der IDENTITY -Eigenschaft, und führen Sie anschließend eine INSERT SELECT ? ORDER BY-Abfrage zum Auffüllen dieser Tabelle.

Weitere Informationen

Die Identitätswerte, die generiert werden, hängen von der Position des GetIdentity() -Funktion in der Abfragestruktur (Showplan), die aufgrund von Änderungen Optimierer, parallelen Abfrageplänen oder das Vorhandensein von TOP-SET ROWCOUNT ändern kann. Während Sie Szenarien, in dem SELECT INTO mit IDENTITY -Funktion und eine ORDER BY-Klausel-Werte in erzeugen, sehen möglicherweise wird eine Bestellung gewünschten dieses Verhalten ist nicht gewährleistet, dass und kann ohne Warnung ändern. Die folgenden Szenarien umfassen eine SELECT INTO-Anweisung und eine IDENTITY -Funktion.

Betrachten Sie eine Tabelle mit dem Namen OldTable und die folgenden Werte.
Col1      Col2
-------   --------
1         A          
11        F 
7         G          
17        I          
2         Z          

1. Szenario

In diesem Szenario die SELECT INTO-Abfrage verwendet, eine IDENTITY-Funktion und eine ORDER BY-Klausel.
SELECT	Col1, Col2, ID=IDENTITY (int, 1, 1)
INTO 	NewTable
FROM 	OldTable
Order By Col1
Neue_tabelle eingefügt werden kann mit Zeilen in eine der folgenden zwei Möglichkeiten.

Methode 1

Col1      Col2       ID
-------   --------   --------
1         A          4
2         Z          2
7         G          5
11        F          3
17        I          1
Sie können feststellen, dass der IDENTITY-Wert, den SQL Server generiert nicht in derselben Reihenfolge wie die Spalte ORDER BY ( SP1 ) in der Abfrage.

Methode 2

Col1     Col2       ID
-------  --------   -------
1        A          1
2        Z          2
7        G          3
11       F          4
17       I          5
In diesem Fall kann auftreten, dass die IDENTITY, SQL Wert erzeugt Server ist in derselben Reihenfolge wie die ORDER BY Spalte ( Col1 ) in der Abfrage. Dies ist jedoch coincidental und ist nicht die garantierte Reihenfolge, die erhalten Sie jedes Mal, wenn die Abfrage ausgeführt wird.

Szenario 2

Die folgenden SELECT INTO-Abfragen verwenden die IDENTITY-Funktion und eine ORDER BY-Klausel mit einer TOP-Operator oder SET ROWCOUNT-Anweisung.
SELECT TOP 3 Col1, Col2, ID=IDENTITY (int, 1, 1)
INTO NewTable
FROM OldTable
Order By Col1
- oder -
SET ROWCOUNT 3
SELECT Col1, Col2, ID=IDENTITY (int, 1, 1)
INTO NewTable
FROM OldTable
Order By Col1
Neue_tabelle eingefügt werden kann mit Zeilen in eine der folgenden drei Möglichkeiten:

Methode 1

Col1   Col2   ID
-----  -----  -----
1      A      2
2      Z      1
7      G      3
In diesem Fall können Sie sehen, dass der IDENTITY-Wert, den SQL Server generiert nicht in derselben Reihenfolge wie die Spalte ORDER BY ( SP1 ) in der Abfrage.

Methode 2

Col1    Col2     ID
------  ------   ------
1       A        1
2       Z        2
7       G        3
In diesem Fall kann auftreten, dass die IDENTITY, SQL Wert erzeugt Server ist genau in derselben Reihenfolge wie die ORDER BY Spalte ( Col1 ) in der Abfrage. Dies ist jedoch coincidental und ist nicht die garantierte Reihenfolge, die erhalten Sie jedes Mal, wenn die Abfrage ausgeführt wird.

Methode 3

Col1   Col2    ID
------ ------  ------
1      A       4
2      Z       2
7      G       5
In diesem Fall ist der IDENTITY-Wert, den SQL Server generiert nicht in derselben Reihenfolge wie die ORDER BY Spalte ( Col1 ) in der Abfrage. Darüber hinaus die Daten eingefügt entspricht nicht den Anforderungen SEED und SCHRITTWEITE in die IDENTITY-Funktion in der Abfrage angegebenen (SEED = 1, SCHRITTWEITE = 1).

Tatsächlich generiert die IDENTITY -Funktion Identität Werte korrekt auf die Parameter SEED und SCHRITTWEITE basieren. Die Identität Wert Generation tritt jedoch ein, bevor die Zeilen basierend auf der ORDER BY-Klausel sortiert sind. Daher beim Verwenden einer TOP-Operator oder eine SET ROWCOUNT-Anweisung, die Zeilen eingefügt, in der resultierenden Tabelle ( Neue_tabelle ) scheint falsche Identitätswerte aufweisen. Die Identitätswerte, die SQL Server erzeugt möglicherweise nicht die SEED- und SCHRITTWEITE Parameter der IDENTITY -Funktion übereinstimmen.

Hier ist ein Beispiel, die eine INSERT INTO SELECT FROM mit ORDER BY-Klausel beinhaltet.

Betrachten Sie eine Tabelle mit dem Namen OldTable und die folgenden Werte:
Col1      Col2
-------   --------
1         S          
11        F 
7         G          
17        I
2         z


Unten wird die Zieltabelle Neue_tabelle bezeichnet (ist eine Identitätsspalte)
ID (identity)    Col1     Col2
---------------    -------   ------


Die folgende INSERT INTO SELECT FROM-Abfrage mit einer ORDER BY-Klausel wird die Spalte garantieren, die ID in Neue_tabelle in derselben Reihenfolge wie SP1 ist.
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

Hinweis: ID Identitätsspalte wird generiert, damit dieselbe Reihenfolge von SP1 . INSERT INTO doesn?t allerdings die physische Reihenfolge der ID oder SP1 in Neue_tabelle garantiert. Zum Abrufen der Daten in der gewünschten Reihenfolge eine ORDER BY-Klausel ist erforderlich, wie folgt SELECT-Anweisung:
SELECT * from NewTable ORDER BY ID

Eigenschaften

Artikel-ID: 273586 - Geändert am: Freitag, 2. November 2007 - Version: 4.2
Die Informationen in diesem Artikel beziehen sich auf:
  • 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
Keywords: 
kbmt kbhowto kbinfo kbpending KB273586 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 273586
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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