表值参数的排序顺序是否保证保持不变? [英] Is the sort-order of table-valued-parameters guaranteed to remain the same?

查看:39
本文介绍了表值参数的排序顺序是否保证保持不变?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

这是我的类型:

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

GetVwdCodeRecordsIEnumerable<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,它不保证任何排序顺序。这可能会运行数百次测试,然后突然中断...
  • 以后的任何操作都可以破坏此排序顺序。想象一下,您有一个工作函数,几个月后,您在一个复杂的查询中使用了这个函数。
例如,我使用它来创建具有确定顺序的XML,因为在XML中有一个隐式顺序,该顺序由位置...

这篇关于表值参数的排序顺序是否保证保持不变?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆