sql - 使用存储过程进行分页

标签 sql sql-server tsql stored-procedures

我正在尝试添加分页存储过程的排序功能。

我该如何做到这一点,到目前为止我已经创建了这个。它工作正常,但当传递 @sort 参数时,它不起作用。

ALTER PROCEDURE [dbo].[sp_Mk]
 @page INT,
 @size INT,
 @sort nvarchar(50) ,
 @totalrow INT  OUTPUT
AS
BEGIN
    DECLARE @offset INT
    DECLARE @newsize INT

    IF(@page=0)
    begin
       SET @offset = @page;
       SET @newsize = @size
    end
    ELSE 
    begin
        SET @offset = @page+1;
        SET @newsize = @size-1
    end
    -- SET NOCOUNT ON added to prevent extra result sets from
    SET NOCOUNT ON;
    WITH OrderedSet AS
    (
      SELECT *,
          ROW_NUMBER() OVER (ORDER BY @sort DESC) AS 'Index'
      FROM [dbo].[Mk]  
    )
   SELECT * 
   FROM OrderedSet 
   WHERE [Index] BETWEEN @offset AND (@offset + @newsize) 

   SET @totalrow = (SELECT COUNT(*) FROM [dbo].[Mk])
END

最佳答案

我正在添加一个答案,因为许多其他答案都建议动态 SQL,这不是最佳实践。您可以使用 OFFSET-FETCH 子句添加分页,该子句为您提供了仅从结果集中获取结果窗口或页面的选项。

注意:OFFSET-FETCH 只能与 ORDER BY 子句一起使用。

示例:

SELECT First Name + ' ' + Last Name FROM Employees 
ORDER BY First Name 
OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY;

如果你把它放在存储过程中

CREATE PROCEDURE [dbo].[uspEmployees_GetAll]  
  @rowOffset int = 0,
  @fetchNextRows int = 100
AS
BEGIN   
    SELECT * FROM Employees     
    ORDER BY ID desc
    OFFSET @rowOffset ROWS FETCH NEXT @fetchNextRows ROWS ONLY;
END

你可以这样调用它

DECLARE @rowOffset int
DECLARE @fetchNextRows int


EXECUTE [dbo].[uspEmployees_GetAll] 
   @rowOffset = 0,
   @fetchNextRows = 30

关于sql - 使用存储过程进行分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17803062/

相关文章:

sql - Oracle SQL - 匹配时更新并插入

sql - 执行计划引用溢出级别 1

sql - 如何更新sql server存储过程中的可为空的列

sql-server - 如何列出 SSRS 数据集中动态 SQL 查询的字段

mysql - T-SQL : calculate in dependence of the content of a column

java - 如何从 SQL 数据库读取记录并将其显示到 JFrame 上?

sql - 如何在 SQL Server 中将多行文本连接成单个文本字符串

mysql - 仅更新用户条目的最后一行

sql-server - FORMATMESSAGE 是否为一个参数值返回多个字符串?

c++ - 如何使用 WinApi 从 MS SQL 表中检索大型二进制数据?