-
Ordre d'un OUTPUT
Bonjour,
je souhaite insérer plusieurs lignes dans une table A possédant une clef primaire IDENTITY.
Plutôt que d'envoyer plusieurs requêtes d'INSERT à la base de données, j'aurais souhaité n'en former qu'une :
INSERT INTO A ... VALUES (infoLigne1),(infoLigne2),(infoLigne3),...
Souhaitant récupérer les ids générés, je pensais ajouter une clause OUTPUT:
INSERT INTO A ... OUTPUT INSERTED.ID VALUES (infoLigne1),(infoLigne2),(infoLigne3),...
En lisant la doc (https://docs.microsoft.com/en-us/sql...e-transact-sql) on peut lire : "There is no guarantee that the order in which the changes are applied to the table and the order in which the rows are inserted into the output table or table variable will correspond.".
Cela veut dire que rien ne me garantit que la première ligne retournée par l'output concernera bien l'id de la ligne1?
Merci
-
Oui, "output" est un peu comme une table logique (au détail près qu'on ne peut pas requêter dessus à moins de passer par une variable table).
Donc les lignes ne sont pas ordonnées.
Cependant, en quoi est-ce gênant ?
-
Merci pour cette réponse!
En fait, côté application, j'aurai aimé pouvoir retourner les id's aux objets correspondants.
En prenant un exemple :
Si un utilisateur passe une commande comportant plusieurs articles. Qu'il existe une table Commande et une table Article avec une clef étrangère vers la table Commande. Avant d'insérer les articles il faut insérer la commande et récupérer son ID (via un SCOPE_IDENTITY() ou un OUTPUT). Une fois fait, je peux insérer mes articles grâce à l'ID retourné par la première requête.
Maintenant s'il y a plusieurs commandes j'aurai aimé pouvoir utiliser un "INSERT INTO Commande OUTPUT inserted.ID VALUES (infoCmd1),(infoCmd2),..." avec ma liste de commandes, en retour récupérer les ids de ces commandes, puis insérer les articles des commandes via une seconde requête.
Si l'OUTPUT ne me garantit pas que la première ligne est l'ID de la commande 1 mais potentiellement celle d'une autre, ça risque d'être un beau mélange.
l'exemple n'est peut-être pas correct... et peut-être y a il de biens meilleurs moyens de procéder...
Y'a-t-il un moyen de faire ce genre de traitements en deux requêtes ou faut-il une requête pour chaque commande et une dernière pour les articles?