我通过用户定义的表类型插入数据,并且我以错误的顺序取回插入的标识值。
这是存储过程:
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 :(得分: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'
)?我建议您确保您的列表使用数字类型而不是字符串,否则不总是按照您期望的方式排序。