【问题标题】:SQL paging sortingSQL分页排序
【发布时间】:2009-05-01 09:16:25
【问题描述】:

我需要在网页上显示一个网格。数据将通过存储过程来自 SQL Server 2008。由于存储过程返回了数千条记录,我决定选择一个工作正常的分页选项。在存储过程中,我做了这样的事情:

declare @RowIdMin int=10  
declare @RowIdMax int=25  

select * 
from (select Col1, Col2, ROW_NUMBER() over (order by Col1 desc) as RowId  
      from MyTable ) dt  
where RowId BETWEEN @RowIdMin AND @RowIdMax    

只要用户乐于获得按 Col1 排序的数据,此方法就可以正常工作。如果我事先不知道记录集必须按哪一列排序,我该如何重写?这不起作用:

declare @RowIdMin int=10  
declare @RowIdMax int=25  

声明@ColSort varchar(100)='MyColumn'

select * 
from (select Col1, Col2, ROW_NUMBER() over (order by <b>@ColSort</b> desc) as RowId  
from MyTable) dt  
where RowId BETWEEN @RowIdMin AND @RowIdMax   

【问题讨论】:

    标签: sql sorting paging


    【解决方案1】:

    当@ColSort = 'ABC' THEN ABC ....时从 MyTable 按大小写排序。

    更详尽的解释

    http://www.extremeexperts.com/sql/articles/CASEinORDER.aspx

    【讨论】:

      【解决方案2】:

      动态 SQL 可能是您最好的选择;换掉 row_number() 函数中的排序选项。你也可以参数化executesql中的选项见msdn

      declare @SQLScript nVarchar(4000)
      
      declare @RowIdMin int=10
      declare @RowIdMax int=25
      declare @ColSort varchar(100)='MyColumn'
      
      
      Select @SQLScript = 'select * from (select Col1, Col2, ROW_NUMBER() over (order by ' + @ColSort + 'desc) as RowId from MyTable  dt where RowId BETWEEN ' + cast(@RowIdMin as nvarchar(100))+ ' AND ' + cast(@RowIdMax as nvarchar(100))
      
      exec sp_executesql @SQLScript
      

      【讨论】:

      • 我将为 200 Alex 进行 SQL 注入!
      • 任何不验证输入的人都应该使用它们来生成输出
      • 这就是为什么评论是关于他的回答天才。
      【解决方案3】:

      我完全同意其他帖子,动态 SQL 或 CASE 语句 order by 是您所描述的执行此操作的选项。

      不过,顺便看看您正在使用的框架的其余部分。如果它的 asp.net 3.5 那么它内置的网格和 linq 将为您完成所有这些工作,并且非常轻松。试试看http://www.asp.net/learn

      【讨论】:

        猜你喜欢
        • 2012-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-29
        • 1970-01-01
        • 2011-09-12
        • 2017-08-04
        • 2016-12-27
        相关资源
        最近更新 更多