T-SQL:ORDER BY“表达式”

发布于 2024-12-11 17:57:46 字数 593 浏览 0 评论 0原文

所有将数据返回到我当前正在开发的 Web 服务的表示层的存储过程都将两个整数作为参数:@StartingRow 和 @MaximumRows,这样我就可以对结果进行分页,而无需每次都检索整个结果列表。现在我想在这些程序中引入排序,但是据我所知,每个人都使用动态SQL来进行排序:

EXEC ( 'WITH [Results] AS 
        ( SELECT * , 
             ROW_NUMBER() OVER ( ORDER BY ' + @SortExpression + @Direction + ')  AS 'RowNumber' 
          FROM [SomeTable] ) 
        SELECT [Column1] , [Column2] 
        WHERE ( [RowNumber] BETWEEN ' + @StartingRow + 
                          ' AND ( ' + @StartingRow + ' + ' + @MaximumRows + ' - 1) )' )

这种方法的问题是,由于客户的需求,我不能使用动态SQL,所以我无法指定结果排序所依据的列。那我有什么选择呢?

All stored procedures which return data to the presentation layer of the webservice I am currently developing take as parameters two integers, @StartingRow and @MaximumRows, so that I can paginate results without retrieving the whole result list everytime. Now I would like to introduce sorting in these procedures, but from what I see everyone uses dynamic SQL to do the ordering:

EXEC ( 'WITH [Results] AS 
        ( SELECT * , 
             ROW_NUMBER() OVER ( ORDER BY ' + @SortExpression + @Direction + ')  AS 'RowNumber' 
          FROM [SomeTable] ) 
        SELECT [Column1] , [Column2] 
        WHERE ( [RowNumber] BETWEEN ' + @StartingRow + 
                          ' AND ( ' + @StartingRow + ' + ' + @MaximumRows + ' - 1) )' )

The problem with this approach is that I can't use dynamic SQL due to customer's demand, so that I can't specify the column according to which the results should be sorted. What are my options, then?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

遗弃M 2024-12-18 17:57:46

您可以使用案例。当 @SortParameter 等于 1 时,此示例按 Col1 排序。对于参数 5,它按 Col2 降序排序。

order by
        case 
        when @SortParameter = 1 then Col1
        when @SortParameter = 2 then Col2
        ...
        end
,       case 
        when @SortParameter = 4 then Col1
        when @SortParameter = 5 then Col2
        ...
        end DESC

SQL Server 无法通过这种方法使用索引。这是使用动态 SQL 的主要原因。

You could use a case. This example sorts on Col1 when @SortParameterequals 1. For parameter 5, it sorts by Col2 in descending order.

order by
        case 
        when @SortParameter = 1 then Col1
        when @SortParameter = 2 then Col2
        ...
        end
,       case 
        when @SortParameter = 4 then Col1
        when @SortParameter = 5 then Col2
        ...
        end DESC

SQL Server cannot use indexes with this approach. Which is the prime reason for using dynamic SQL instead.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文