Много подобният въпрос беше зададен преди.
Можете да посочите ORDER BY
в INSERT
.
Ако направите това, редът, в който IDENTITY
генерираните стойности гарантирано съответстват на посочения ORDER BY
в INSERT
.
Използвайки вашия пример:
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;
Резултатът е:
+----+-------+
| ID | Name |
+----+-------+
| 1 | Jonny |
| 2 | Sally |
| 3 | Timmy |
+----+-------+
Тоест Name
са сортирани и идентификаторите са генерирани в съответствие с този ред. Гарантирано е, че Джони ще има най-ниската ID, Тими ще има най-високата ID, Сали ще има ID между тях. Възможно е да има пропуски между генерираните ID стойности, но техният относителен ред е гарантиран.
Ако не посочите ORDER BY
в INSERT
, след което се получава IDENTITY
Идентификаторите могат да бъдат генерирани в различен ред.
Имайте предвид, че няма гаранция за действителния физически ред на редовете в таблицата дори с ORDER BY
в INSERT
, единствената гаранция са генерираните идентификатори.
Във въпрос INSERT INTO като SELECT с ORDER BY Умачандар Джаячандран от MS каза:
И той даде връзка към Поръчване гаранции в SQL Server , където Conor Cunningham от SQL Server Engine Team казва:
Има връзка към статия в базата знания на MS в коментарите в тази публикация:Поведението на функцията IDENTITY, когато се използва с SELECT INTO или INSERT .. SELECT заявки, които съдържат клауза ORDER BY , което го обяснява по-подробно. Пише:
Бих считал тази статия от БЗ за официална документация и смятам това поведение за гарантирано.