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.