Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

L'ordine è garantito quando si inseriscono più righe con identità?

Il molto simile domanda è stato chiesto prima.

Puoi specificare un ORDER BY nel INSERT .

Se lo fai, l'ordine in cui è IDENTITY i valori generati sono garantiti per corrispondere al ORDER BY specificato nel INSERT .

Usando il tuo esempio:

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;

Il risultato è:

+----+-------+
| ID | Name  |
+----+-------+
|  1 | Jonny |
|  2 | Sally |
|  3 | Timmy |
+----+-------+

Cioè, Name sono stati ordinati e gli ID sono stati generati in base a questo ordine. È garantito che Jonny avrà l'ID più basso, Timmy avrà l'ID più alto, Sally avrà un ID tra di loro. Potrebbero esserci delle lacune tra i valori ID generati, ma il loro ordine relativo è garantito.

Se non specifichi ORDER BY in INSERT , quindi IDENTITY risultante Gli ID possono essere generati in un ordine diverso.

Intendiamoci, non vi è alcuna garanzia per l'effettivo ordine fisico delle righe nella tabella anche con ORDER BY in INSERT , l'unica garanzia sono gli ID generati.

In una domanda INSERTI IN come SELECT con ORDER BY Umachandar Jayachandran della SM ha dichiarato:

E ha fornito un collegamento a Ordinazione garanzie in SQL Server , dove Conor Cunningham di SQL Server Engine Team dice:

C'è un collegamento all'articolo della Knowledge Base di MS nei commenti in quel post:Il comportamento di la funzione IDENTITY quando utilizzata con SELECT INTO o INSERT .. SELECT query che contengono una clausola ORDER BY , che lo spiega in modo più dettagliato. Dice:

Considero questo articolo della Knowledge Base una documentazione ufficiale e considero garantito questo comportamento.