我正在尝试添加分页存储过程的排序功能。
我该如何做到这一点,到目前为止我已经创建了这个。它工作正常,但当传递 @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/