gpt4 book ai didi

c# - 表值参数的排序顺序是否保证保持不变?

转载 作者:太空狗 更新时间:2023-10-29 21:38:10 25 4
gpt4 key购买 nike

我需要知道我是否需要向我的自定义表类型添加一个排序列,然后我可以使用它进行排序,或者我是否可以相信即使没有这样的列,参数的顺序也保持不变。

这是我喜欢的类型:

CREATE TYPE [dbo].[VwdCodeList] AS TABLE(
[VwdCode] [varchar](50) NOT NULL
)

这是使用它的 sql 之一:

/// <summary>
/// Inserts all new WatchListCodes for a given watchlist
/// </summary>
public const string InsertWatchListCodes = @"
INSERT INTO [dbo].[WatchListCodes]
([WatchListID]
,[VwdCode]
,[Sort])
SELECT @WatchListID, VwdCode, ROW_NUMBER()OVER(ORDER BY (SELECT 1))
FROM @VwdCodeList;";

如你所见,我正在使用 ROW_NUMBER获取排序列值。

我是否还需要向表类型添加一个排序列,还是保证(记录)它保持不变?它似乎有效。

这是我使用它的 ADO.NET 代码:

SqlParameter vwdCodeListParameter = insertWatchListCodeCommand.Parameters.Add("@VwdCodeList", SqlDbType.Structured);
vwdCodeListParameter.TypeName = "[dbo].[VwdCodeList]";
vwdCodeListParameter.Value = WatchListSql.GetVwdCodeRecords(newVwdCodes, true);
int inserted = insertWatchListCodeCommand.ExecuteNonQuery();

GetVwdCodeRecords返回 IEnumerable<SqlDataRecord>对于 IEnumerable<string> .


谢谢大家。如果 future 的读者有兴趣知道我是如何保证排序顺序的。我已经按照建议通过添加另一列修改了表类型:

CREATE TYPE [dbo].[VwdCodeList] AS TABLE(
[VwdCode] [varchar](50) NOT NULL,
[Sort] [smallint] NOT NULL
)

insert-sql 更简单,因为排序列是传入的而不是计算的:

public const string InsertWatchListCodes = @"
INSERT INTO [dbo].[WatchListCodes]
([WatchListID]
,[VwdCode]
,[Sort])
SELECT @WatchListID, cl.VwdCode, cl.Sort
FROM @VwdCodeList cl;";

为了完整起见,这里是返回 IEnumerable<SqlDataRecord> 的方法用作表值参数的值(省略错误处理):

public static IEnumerable<SqlDataRecord> GetVwdCodeRecords(IEnumerable<string> vwdCodes, bool trimCode = true)
{
short currentSort = 0;
foreach (string vwdCode in vwdCodes)
{
var record = new SqlDataRecord(
new SqlMetaData("VwdCode", SqlDbType.VarChar, 50),
new SqlMetaData("Sort", SqlDbType.SmallInt));
record.SetString(0, trimCode ? vwdCode.Trim() : vwdCode);
record.SetInt16(1, ++currentSort);

yield return record;
}
}

最佳答案

一般来说:任何结果集都没有隐含的排序顺序

实现保证排序顺序唯一方法是在最外层查询上使用ORDER BY .

我相信你已经知道了......

有一个specialty with ROW_NUMBER() OVER(ORDER BY ...) Read "General Remarks" .但这是危险的。

  • 只有在 ORDER BY 中使用唯一的排序标准时,排序顺序才确定。您正在使用 SELECT 1,它不能保证任何排序顺序。这可能会进行数百次测试并突然中断......
  • 以后的任何操作都可能破坏此排序顺序。试想一下,您有一个可用的函数,并且 - 几个月后 - 您在复杂的查询中使用了这个函数。

例如,我使用它来创建具有确定顺序的 XML,因为在 XML 中有一个由位置给出的隐式顺序...

关于c# - 表值参数的排序顺序是否保证保持不变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39467251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com