一个分页存储过程,Sql2005及以上版本支持(求更高效的分页算法)

本文深入探讨了SQL分页查询的实现原理及优化方法,包括如何使用窗口函数实现高效分页,避免全表扫描,减少数据库负载。通过实例演示,帮助开发者提升查询性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/****** Object:  StoredProcedure [dbo].[PageQuery]    Script Date: 04/13/2012 14:26:57 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE PROCEDURE [dbo].[Page_Query]
	@TableName   NVARCHAR(255),			-- 表名
	@Fields NVARCHAR(1000) = '*',		-- 需要返回的列
	@OrderFields NVARCHAR(255)='',		-- 排序的字段名,不带ORDER BY 关键字,必填
	@PageSize   INT = 10,				-- 页尺寸
	@PageIndex  INT = 1,				-- 页码
	@Where  NVARCHAR(1500) = '',		-- 查询条件 (注意: 不要加 where)
	@NeedCount BIT = 0,
	@RecordCount INT OUTPUT
AS
BEGIN
	DECLARE @ExceSql NVARCHAR(MAX)

	IF @Where !=''
	  SET @Where =' WHERE ' + @Where

	SET @ExceSql='SELECT * FROM (SELECT ROW_NUMBER() OVER ( ORDER BY ' + @OrderFields + ') AS pos,' + @Fields + ' FROM ' + @TableName + @Where + ') AS sp WHERE pos BETWEEN '+STR( ( @PageIndex - 1 ) * @PageSize + 1 ) + ' AND ' + STR( @PageIndex * @PageSize )
	EXEC (@ExceSql)

	SET @RecordCount = 0
	IF @NeedCount = 1
	BEGIN
		SET @ExceSql='SELECT @RecordCount=COUNT(1) FROM ' + @TableName + @Where
		EXEC sp_executesql @ExceSql, N'@RecordCount INT OUTPUT', @RecordCount OUTPUT
	END
END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烈火蜓蜻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值