Velmi podobný otázku byl dotazován dříve.
Můžete zadat ORDER BY
v INSERT
.
Pokud tak učiníte, pořadí, ve kterém IDENTITY
hodnoty, které jsou generovány, se zaručeně shodují se zadaným ORDER BY
v INSERT
.
Použijte váš příklad:
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;
Výsledek je:
+----+-------+
| ID | Name |
+----+-------+
| 1 | Jonny |
| 2 | Sally |
| 3 | Timmy |
+----+-------+
Tedy Name
byly seřazeny a ID byla vygenerována podle tohoto pořadí. Je zaručeno, že Jonny bude mít nejnižší ID, Timmy bude mít nejvyšší ID, Sally bude mít ID mezi nimi. Mezi vygenerovanými hodnotami ID mohou být mezery, ale jejich relativní pořadí je zaručeno.
Pokud nezadáte ORDER BY
v INSERT
a výsledkem je IDENTITY
ID lze generovat v jiném pořadí.
Nezapomeňte, že neexistuje žádná záruka skutečného fyzického pořadí řádků v tabulce ani v případě ORDER BY
v INSERT
, jedinou zárukou jsou vygenerovaná ID.
V otázce INSERT INTO jako SELECT s ORDER BY Umachandar Jayachandran z MS řekl:
A dal odkaz na Objednávání záruky v SQL Server , kde Conor Cunningham z SQL Server Engine Team říká:
V komentářích k tomuto příspěvku je odkaz na článek znalostní báze MS:Chování funkce IDENTITY při použití s dotazy SELECT INTO nebo INSERT .. SELECT, které obsahují klauzuli ORDER BY , který to vysvětluje podrobněji. Říká:
Tento článek KB bych považoval za oficiální dokumentaci a považoval bych toto chování za zaručené.