Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Ist die Reihenfolge beim Einfügen mehrerer Zeilen mit Identität garantiert?

Der sehr ähnliche Frage wurde schon mal gefragt.

Sie können einen ORDER BY angeben im INSERT .

Wenn Sie das tun, wird die Reihenfolge, in der die IDENTITY Werte generiert werden, stimmt garantiert mit dem angegebenen ORDER BY überein im INSERT .

Anhand Ihres Beispiels:

DECLARE @blah TABLE
(
    ID INT IDENTITY(1, 1) NOT NULL,
    Name VARCHAR(100) NOT NULL
);

INSERT INTO @blah (Name)
SELECT T.Name
FROM
    (
        VALUES
        ('Timmy'),
        ('Jonny'),
        ('Sally')
    ) AS T(Name)
ORDER BY T.Name;

SELECT
    T.ID
    ,T.Name
FROM @blah AS T
ORDER BY T.ID;

Das Ergebnis ist:

+----+-------+
| ID | Name  |
+----+-------+
|  1 | Jonny |
|  2 | Sally |
|  3 | Timmy |
+----+-------+

Das heißt, Name wurden sortiert und IDs wurden gemäß dieser Reihenfolge generiert. Es ist garantiert, dass Jonny die niedrigste ID hat, Timmy die höchste ID, Sally wird ID zwischen ihnen haben. Es kann Lücken zwischen den generierten ID-Werten geben, aber ihre relative Reihenfolge ist garantiert.

Wenn Sie ORDER BY nicht angeben in INSERT , dann resultierende IDENTITY IDs können in einer anderen Reihenfolge generiert werden.

Wohlgemerkt, selbst bei ORDER BY gibt es keine Garantie für die tatsächliche physische Reihenfolge der Zeilen in der Tabelle in INSERT , die einzige Garantie sind die generierten IDs.

In einer Frage INSERT INTO als SELECT mit ORDER BY Umachandar Jayachandran von MS sagte:

Und er gab einen Link zur Bestellung Garantien in SQL Server , wo Conor Cunningham vom SQL Server Engine Team sagt:

In den Kommentaren dieses Beitrags befindet sich ein Link zum Artikel der MS-Wissensdatenbank:Das Verhalten von die IDENTITY-Funktion, wenn sie mit SELECT INTO- oder INSERT .. SELECT-Abfragen verwendet wird, die eine ORDER BY-Klausel enthalten , was es genauer erklärt. Es heißt:

Ich würde diesen KB-Artikel als offizielle Dokumentation betrachten und dieses Verhalten als garantiert ansehen.