IDENTITY值的顺序不正确

时间:2014-01-15 20:25:48

标签: c# sql sql-server identity-column

我通过用户定义的表类型插入数据,并且我以错误的顺序取回插入的标识值。

这是存储过程:

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();

            }

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

1 个答案:

答案 0 :(得分: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将选择它认为最有效的任何排序顺序,而不必费心指定。

另外,为什么要将Id转换为字符串(这也会导致排序问题,因为'55' < '9')?我建议您确保您的列表使用数字类型而不是字符串,否则总是按照您期望的方式排序。