Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

O pedido é garantido ao inserir várias linhas com identidade?


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.