Is the sort-order of table-valued-parameters guaranteed to remain the same?(表值参数的排序顺序是否保证保持不变?)
问题描述
我需要知道是否需要将排序列添加到我的自定义表类型中,然后我可以使用该列进行排序,或者我是否可以相信,即使没有这样的列,参数的顺序也保持不变。
这是我的类型:
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<string>
返回IEnumerable<SqlDataRecord>
。
谢谢大家。如果未来的读者有兴趣了解我是如何保证排序顺序的。我已经按照建议修改了表类型,添加了另一列:
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
,它不保证任何排序顺序。这可能会运行数百次测试,然后突然中断... - 以后的任何操作都可以破坏此排序顺序。想象一下,您有一个工作函数,几个月后,您在一个复杂的查询中使用了这个函数。
这篇关于表值参数的排序顺序是否保证保持不变?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:表值参数的排序顺序是否保证保持不变?


基础教程推荐
- 经典 Asp 中的 ResolveUrl/Url.Content 等效项 2022-01-01
- 首先创建代码,多对多,关联表中的附加字段 2022-01-01
- 从 VS 2017 .NET Core 项目的发布目录中排除文件 2022-01-01
- 错误“此流不支持搜索操作"在 C# 中 2022-01-01
- 如何动态获取文本框中datagridview列的总和 2022-01-01
- 将事件 TextChanged 分配给表单中的所有文本框 2022-01-01
- 在 VS2010 中的 Post Build 事件中将 bin 文件复制到物 2022-01-01
- 全局 ASAX - 获取服务器名称 2022-01-01
- JSON.NET 中基于属性的类型解析 2022-01-01
- 是否可以在 asp classic 和 asp.net 之间共享会话状态 2022-01-01