Ordre incorrect pour les valeurs IDENTITY

J'insère des données via un type de table défini par l'user, et je récupère les valeurs d'identité insérées dans un ordre incorrect.

Voici la procédure stockée:

CREATE PROCEDURE [dbo].[InsertBulkAgency]( @AgencyHeaders As AgencyType READONLY) AS BEGIN insert into [Agency] output Inserted.Id select *,'cm',GETDATE(),'comp',GETDATE() from @AgencyHeaders END 

Et voici le code C # pour save les valeurs d'identité:

  using (SqlCommand cmd = new SqlCommand("InsertBulkAgency", myConnection)) { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("@AgencyHeaders", SqlDbType.Structured).Value = dt; myConnection.Open(); rdr = cmd.ExecuteReader(); while (rdr.Read()) { sample.Add(rdr["Id"].ToSsortingng()); } myConnection.Close(); } 

Les valeurs renvoyées dans la list doivent être séquentielles mais elles sont complètement randoms. Comment puis-je récupérer l'ordre correct des valeurs insérées?

Avez-vous essayé d'append un ORDER BY ?

 insert into dbo.[Agency] output inserted.Id select *,'cm',GETDATE(),'comp',GETDATE() from @AgencyHeaders ORDER BY inserted.Id; 

Ou en utilisant .sort() une fois que vous avez datatables dans votre application.

Si vous ne disposez pas d'un ORDER BY , vous ne devriez pas vous attendre à une command spécifique de SQL Server. Pourquoi les valeurs de la list devraient-elles être dans un ordre séquentiel, si vous venez de dire «donnez-moi cet set»? Pourquoi SQL Server devrait-il prédire que vous souhaitez les sortinger d'une manière spécifique? Et si cela supposait que vous vouliez que datatables soient sortingées, pourquoi ne choisirait-il pas le nom ou toute autre colonne à order? La vérité est, SQL Server choisira n'importe quel ordre de sorting qu'il juge le plus efficace, si vous l'avez effectivement dit que vous ne vous souciez pas, en ne prenant pas la peine de spécifier.

Aussi, pourquoi convertissez-vous l'Id en une string (ce qui causera aussi des problèmes avec le sorting, puisque '55' < '9' )? Je vous suggère de vous assurer que votre list utilise un type numérique plutôt qu'une string, sinon elle ne sortingera pas toujours comme vous le souhaitez.