Den mycket liknande fråga tillfrågades tidigare.
Du kan ange en ORDER BY
i INSERT
.
Om du gör det, i vilken ordning IDENTITY
värden som genereras kommer garanterat att matcha den angivna ORDER BY
i INSERT
.
Med ditt exempel:
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;
Resultatet är:
+----+-------+
| ID | Name |
+----+-------+
| 1 | Jonny |
| 2 | Sally |
| 3 | Timmy |
+----+-------+
Det vill säga Name
har sorterats och ID har genererats enligt denna ordning. Det är garanterat att Jonny kommer att ha lägst ID, Timmy kommer att ha högsta ID, Sally kommer att ha ID mellan dem. Det kan finnas luckor mellan de genererade ID-värdena, men deras relativa ordning är garanterad.
Om du inte anger ORDER BY
i INSERT
, sedan resulterande IDENTITY
ID kan genereras i en annan ordning.
Tänk på att det inte finns någon garanti för den faktiska fysiska ordningen av rader i tabellen även med ORDER BY
i INSERT
, den enda garantin är de genererade ID:n.
I en fråga INSERT INTO som SELECT med ORDER BY Umachandar Jayachandran från MS sa:
Och han gav en länk till beställning garantier i SQL Server , där Conor Cunningham från SQL Server Engine Team säger:
Det finns en länk till artikeln i MS kunskapsbas i kommentarerna i det inlägget:Beteendet hos IDENTITY-funktionen när den används med SELECT INTO eller INSERT .. SELECT-frågor som innehåller en ORDER BY-sats , som förklarar det mer detaljerat. Det står:
Jag skulle betrakta den här KB-artikeln som en officiell dokumentation och betrakta detta beteende garanterat.