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

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
Dieser Artikel wurde archiviert. Er wird im vorliegenden Zustand bereitgestellt und nicht mehr aktualisiert.
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 	NewTableFROM 	OldTableOrder By Col1
Neue_tabelle eingefügt werden kann mit Zeilen in eine der folgenden zwei Möglichkeiten.

Methode 1

Col1      Col2       ID-------   --------   --------1         A          42         Z          27         G          511        F          317        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          12        Z          27        G          311       F          417       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 NewTableFROM OldTableOrder By Col1
- oder -
SET ROWCOUNT 3SELECT Col1, Col2, ID=IDENTITY (int, 1, 1)INTO NewTableFROM OldTableOrder By Col1
Neue_tabelle eingefügt werden kann mit Zeilen in eine der folgenden drei Möglichkeiten:

Methode 1

Col1   Col2   ID-----  -----  -----1      A      22      Z      17      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        12       Z        27       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       42      Z       27      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        I2         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         S2                2         z3                7         G4                11        F5                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
@@ Identität Identität Sql Sortierung Reihenfolge wählen einfügen

Warnung: Dieser Artikel wurde automatisch übersetzt.

Eigenschaften

Artikelnummer: 273586 – Letzte Überarbeitung: 12/05/2015 21:44:24 – Revision: 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 KbMtde
Feedback