Bardzo podobny pytanie został wcześniej zapytany.
Możesz określić ORDER BY
w INSERT
.
Jeśli to zrobisz, kolejność, w jakiej IDENTITY
wartości są generowane na pewno pasują do określonego ORDER BY
w INSERT
.
Na twoim przykładzie:
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;
Wynik:
+----+-------+
| ID | Name |
+----+-------+
| 1 | Jonny |
| 2 | Sally |
| 3 | Timmy |
+----+-------+
To znaczy Name
zostały posortowane i identyfikatory zostały wygenerowane zgodnie z tą kolejnością. Gwarantujemy, że Jonny będzie miał najniższy identyfikator, Timmy najwyższy, Sally będzie miał identyfikator między nimi. Mogą występować luki między wygenerowanymi wartościami identyfikatorów, ale ich względna kolejność jest gwarantowana.
Jeśli nie określisz ORDER BY
w INSERT
, a następnie wynikowa IDENTITY
Identyfikatory mogą być generowane w innej kolejności.
Pamiętaj, że nie ma gwarancji rzeczywistej fizycznej kolejności wierszy w tabeli, nawet w przypadku ORDER BY
w INSERT
, jedyną gwarancją są wygenerowane identyfikatory.
W pytaniu INSERT INTO jako SELECT z ORDER BY Umachandar Jayachandran z MS powiedział:
I podał link do Zamawianie gwarancje w SQL Server , gdzie Conor Cunningham z zespołu SQL Server Engine mówi:
W komentarzach w tym poście znajduje się link do artykułu z bazy wiedzy MS:Zachowanie funkcja IDENTITY w przypadku użycia z zapytaniami SELECT INTO lub INSERT .. SELECT zawierającymi klauzulę ORDER BY , co wyjaśnia to bardziej szczegółowo. Mówi:
Uważam ten artykuł KB za oficjalną dokumentację i uważam to zachowanie za gwarantowane.