O muito semelhante pergunta foi perguntado antes.
Você pode especificar um
ORDER BY
no INSERT
. Se você fizer isso, a ordem em que a
IDENTITY
valores são gerados é garantido para corresponder ao ORDER BY
especificado no INSERT
. Usando seu exemplo:
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;
O resultado é:
+----+-------+
| ID | Name |
+----+-------+
| 1 | Jonny |
| 2 | Sally |
| 3 | Timmy |
+----+-------+
Ou seja,
Name
foram ordenados e os IDs foram gerados de acordo com esta ordem. É garantido que Jonny terá o ID mais baixo, Timmy terá o ID mais alto, Sally terá o ID entre eles. Pode haver lacunas entre os valores de ID gerados, mas sua ordem relativa é garantida. Se você não especificar
ORDER BY
em INSERT
, resultando em IDENTITY
Os IDs podem ser gerados em uma ordem diferente. Lembre-se, não há garantia para a ordem física real das linhas na tabela, mesmo com
ORDER BY
em INSERT
, a única garantia são os IDs gerados. Em uma pergunta INSERT INTO como SELECT com ORDER BY Umachandar Jayachandran de MS disse:
E ele deu um link para Ordering garantias no SQL Server , onde Conor Cunningham do SQL Server Engine Team diz:
Há um link para o artigo da base de conhecimento do MS nos comentários dessa postagem:O comportamento de a função IDENTITY quando usada com SELECT INTO ou INSERT .. consultas SELECT que contêm uma cláusula ORDER BY , que o explica com mais detalhes. Diz:
Eu consideraria este artigo da KB como uma documentação oficial e consideraria esse comportamento garantido.