Le comportement de la fonction IDENTITY lorsqu'il est utilisé avec SELECT INTO ou INSERT Requêtes SELECT qui contiennent une clause ORDER BY

Traductions disponibles Traductions disponibles
Numéro d'article: 273586 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Résumé

Lorsque vous utilisez une requête SELECT INTO avec la fonction IDENTITY et une clause ORDER BY, les valeurs d'identité générés ne sont pas garantis ont le même ordre que celui fourni par la clause ORDER BY. Par exemple, si la fonction IDENTITY commence par une valeur de départ de 1 et un incrément de 1, la première ligne du jeu de résultats ordonnée pourrait comporter une valeur différente de 1, la deuxième ligne peut avoir une valeur différente de celle 2 et forth.While l'ordre s'affiche comme prévu, le comportement n'est pas garanti. La présence de TOP ou SET ROWCOUNT ne garantit pas plus de l'ordre des lignes.

Si vous voulez que les valeurs IDENTITY à affecter de façon séquentielle qui suit l'ordre dans la clause ORDER BY, créer une table qui contient une colonne avec la propriété IDENTITY, puis exécutez une instruction INSERT SELECT... ORDER BY requête pour remplir cette table.

Plus d'informations

Les valeurs d'identité générés dépendent de la position de la fonction GetIdentity() dans l'arborescence de la requête (showplan), qui peut changer en raison de modifications d'optimiseur, les plans de requête parallèle ou la présence de TOP/SET ROWCOUNT. Tandis que peut afficher des scénarios dans lesquels SELECT INTO avec une fonction IDENTITY et une clause ORDER BY produire des valeurs dans une commande que vous le souhaitez ce comportement n'est pas garantie et peut changer sans avertissement. Les scénarios suivants impliquent une instruction SELECT INTO et une fonction IDENTITY.

Supposons une table nommée OldTable avec les valeurs suivantes.
Col1      Col2
-------   --------
1         A          
11        F 
7         G          
17        I          
2         Z          

Scénario 1

Dans ce scénario, la requête SELECT INTO utilise une fonction IDENTITY et une clause ORDER BY.
SELECT	Col1, Col2, ID=IDENTITY (int, 1, 1)
INTO 	NewTable
FROM 	OldTable
Order By Col1
nouvelletable peut être inséré avec les lignes d'une des options suivantes de deux manières.

Méthode 1

Col1      Col2       ID
-------   --------   --------
1         A          4
2         Z          2
7         G          5
11        F          3
17        I          1
Vous pouvez remarquer que la valeur IDENTITY qui génère de SQL Server n'est pas dans le même ordre que la colonne ORDER BY (Col1) dans la requête.

Méthode 2

Col1     Col2       ID
-------  --------   -------
1        A          1
2        Z          2
7        G          3
11       F          4
17       I          5
Dans ce cas, vous pouvez remarquer que l'IDENTITY de valeur que SQL Server génère sont dans exactement le même ordre que la colonne ORDER BY (Col1) dans la requête. Toutefois, cela est fortuite et n'est pas l'ordre garanti que vous recevrez chaque exécution de la requête.

Scénario 2

Les requêtes SELECT INTO suivantes utilisent la fonction IDENTITY et une clause ORDER BY, avec un opérateur TOP ou une instruction SET ROWCOUNT.
SELECT TOP 3 Col1, Col2, ID=IDENTITY (int, 1, 1)
INTO NewTable
FROM OldTable
Order By Col1
- ou -
SET ROWCOUNT 3
SELECT Col1, Col2, ID=IDENTITY (int, 1, 1)
INTO NewTable
FROM OldTable
Order By Col1
nouvelletable peut être inséré avec les lignes d'une des options suivantes trois façons :

Méthode 1

Col1   Col2   ID
-----  -----  -----
1      A      2
2      Z      1
7      G      3
Dans ce cas, vous pouvez voir que la valeur IDENTITY qui génère de SQL Server n'est pas dans le même ordre que la colonne ORDER BY (Col1) dans la requête.

Méthode 2

Col1    Col2     ID
------  ------   ------
1       A        1
2       Z        2
7       G        3
Dans ce cas, vous pouvez remarquer que l'IDENTITY de valeur que SQL Server génère sont exactement dans le même ordre que la colonne ORDER BY (Col1) dans la requête. Toutefois, cela est fortuite et n'est pas l'ordre garanti que vous recevrez chaque exécution de la requête.

Méthode 3

Col1   Col2    ID
------ ------  ------
1      A       4
2      Z       2
7      G       5
Dans ce cas, la valeur IDENTITY qui génère de SQL Server n'est pas dans le même ordre que la colonne ORDER BY (Col1) dans la requête. En outre, les données insérées ne correspondent pas aux exigences SEED et INCREMENT spécifiées dans la fonction IDENTITY dans la requête (SEED = 1, INCREMENT = 1).

En fait, la fonction IDENTITY génère des valeurs d'identité correctement en fonction des paramètres SEED et INCREMENT. Toutefois, la génération de valeur d'identité se produit avant que les lignes sont triées en fonction de la clause ORDER BY. Par conséquent, lorsque vous utilisez un opérateur TOP ou SET ROWCOUNT instruction, les lignes insérées dans la table résultante (nouvelletable) semblent avoir des valeurs d'identité incorrecte. Les valeurs d'identité que SQL Server génère risquent de ne pas correspondre aux SEED et INCREMENT paramètres de la fonction IDENTITY.

Voici un exemple qui implique un INSERT INTO SELECT FROM avec clause ORDER BY.

Prenez une table nommée OldTable avec les valeurs suivantes :
Col1      Col2
-------   --------
1         S          
11        F 
7         G          
17        I
2         z


Ci-dessous la table cible est nommée nouvelletable (ID est une colonne d'identité)
ID (identity)    Col1     Col2
---------------    -------   ------


La requête INSERT INTO SELECT FROM suivante avec une clause ORDER BY garantit cette colonne QU'ID dans nouvelletable est dans le même ordre que Col1.
INSERT INTO NewTable (Col1, Col2) SELECT Col1, Col2 FROM OldTable ORDER BY Col1 
ID (identity)    Col1     Col2
-------------    ------   ------
1                1         S
2                2         z
3                7         G
4                11        F
5                17        I

Remarque ID de colonne d'identité est généré pour que le même ordre que de Col1. Toutefois, INSERT INTO ne garantit l'ordre physique des ID ou Col1 dans nouvelletable pas. Pour récupérer les données dans l'ordre souhaité, une clause ORDER BY est requise comme indiqué par suivant l'instruction SELECT :
SELECT * from NewTable ORDER BY ID

Propriétés

Numéro d'article: 273586 - Dernière mise à jour: vendredi 2 novembre 2007 - Version: 4.2
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft SQL Server 7.0 Standard
  • Microsoft SQL Server 2000 Desktop Engine (Windows)
  • Microsoft SQL Server 2000 Édition Développeur
  • Microsoft SQL Server 2000 Édition Entreprise
  • Microsoft SQL Server 2000 Édition Personelle
  • Microsoft SQL Server 2000 Standard
Mots-clés : 
kbmt kbhowto kbinfo kbpending KB273586 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 273586
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com