Le très similaire question a déjà été demandé.
Vous pouvez spécifier un ORDER BY
dans le INSERT
.
Si vous faites cela, l'ordre dans lequel le IDENTITY
les valeurs générées sont garanties pour correspondre au ORDER BY
spécifié dans le INSERT
.
En utilisant votre exemple :
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;
Le résultat est :
+----+-------+
| ID | Name |
+----+-------+
| 1 | Jonny |
| 2 | Sally |
| 3 | Timmy |
+----+-------+
C'est-à-dire Name
ont été triés et les identifiants ont été générés selon cet ordre. Il est garanti que Jonny aura l'ID le plus bas, Timmy aura l'ID le plus élevé, Sally aura l'ID entre eux. Il peut y avoir des écarts entre les valeurs d'ID générées, mais leur ordre relatif est garanti.
Si vous ne spécifiez pas ORDER BY
dans INSERT
, puis résultant IDENTITY
Les identifiants peuvent être générés dans un ordre différent.
Attention, il n'y a aucune garantie pour l'ordre physique réel des lignes dans la table même avec ORDER BY
dans INSERT
, la seule garantie est les identifiants générés.
Dans une question INSERT INTO comme SELECT avec ORDER BY Umachandar Jayachandran de MS a déclaré :
Et il a donné un lien vers Commander garanties dans SQL Server , où Conor Cunningham de l'équipe SQL Server Engine déclare :
Il existe un lien vers l'article de la base de connaissances MS dans les commentaires de ce message :Le comportement de la fonction IDENTITY lorsqu'elle est utilisée avec des requêtes SELECT INTO ou INSERT .. SELECT contenant une clause ORDER BY , qui l'explique plus en détail. Il dit :
Je considérerais cet article de la base de connaissances comme une documentation officielle et considérerais ce comportement comme garanti.