2014-01-15 33 views
1

我通过用户定义的表型插入数据,并且我正在回不正确的顺序被插入的标识值。为IDENTITY不正确的顺序值

这里是存储过程:

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

这里是C#代码保存标识值:列表中

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"].ToString()); 
       } 
       myConnection.Close(); 

      } 

返回的值应该是连续的,但它们是完全随机的。我如何检索插入值的正确顺序?

+0

要么添加'ORDER BY'子句来查询,或者只是在的.sort C#列表中,右键? – Scotch

回答

3

你尝试添加ORDER BY

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

或者使用.sort()将数据返回到您的应用程序中。

如果你没有一个ORDER BY呢,你不应该指望从SQL Server中的任何特定的顺序。为什么列表中的值应该是任何顺序的,如果你刚刚说过“给我这个集合”? SQL Server为什么要预测你希望它们以任何特定的方式排序?如果它确实假设你想要对数据进行排序,为什么它不选择名称或任何其他列来排序?事实是,如果你已经有效地告诉它你不关心,那么SQL Server将会选择它认为最有效的排序顺序,因为不用指定。

而且,你为什么转换标识为一个字符串(这也将导致问题的排序,因为'55' < '9')?我建议你确保你的列表使用的是数字类型而不是字符串,否则它总是按你期望的方式排列。

+0

完美生病只是对最终结果进行排序 –