存储过程实现分页

本文介绍了一个使用SQL Server实现的通用分页存储过程,通过灵活配置参数如表名、字段名、排序方式等,可以方便地应用于不同场景下的数据分页查询。

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

CREATE PROCEDURE [dbo].[sp_page] 
@strTable           VARCHAR(1000),       --表名   
@strColumn        VARCHAR(100),       --按该列来进行分页,多表链接的时候要填写表名、列名、排序方式(table:column [ASC | DESC])
@strColumn2      VARCHAR(100),       --按该列来进行分页,只需要填写列名、排序方式(column [ASC | DESC])
@intOrder           BIT,                           --排序,0-顺序,1-倒序   
@strColumnlist    VARCHAR(800),       --要查询出的字段列表,*表示全部字段   
@intPageSize     INT,                          --每页记录数   
@intPageNum    INT,                          --指定页   
@strWhere         VARCHAR(800),       --查询条件   
@intPageCount  INT   OUTPUT         --总页数   
AS   
DECLARE   @sql            NVARCHAR(4000)   --用于构造SQL语句
DECLARE   @where1     VARCHAR(800)       --构造条件语句
DECLARE   @orderby1     VARCHAR(800)       --构造条件语句
DECLARE   @count       INT                           --记录符合条件的总条数 

IF   @strWhere   is   null   or   rtrim(@strWhere)=''   
-- 为了避免SQL关键字与字段、表名等连在一起,首先为传入的变量添加空格
	BEGIN  --没有查询条件   
		SET   @where1='  '   
	END   
ELSE   
	BEGIN  --有查询条件   
		SET   @where1='  WHERE  ('+@strWhere+')  '   
	END   

SET @orderby1 = LOWER(@strColumn)
IF CHARINDEX(',',@orderby1) <> 0 
	BEGIN
		IF CHARINDEX('desc', @orderby1) = 0  
			BEGIN 
				SET  @orderby1=REPLACE(@orderby1, 'asc', 'desc');
			END
		ELSE
			BEGIN 
				SET  @orderby1=REPLACE(@orderby1, 'desc', 'asc');
			END
	END

SET  @strColumn = ' ' + @strColumn + ' '
SET  @strColumnlist = ' ' + @strColumnlist + ' '

--计算符合记录的总条数。
SET   @sql='SELECT @count=COUNT(*)  FROM  ' + @strTable + @where1  
EXEC sp_executesql  @sql, N'@count   int   OUTPUT', @count   OUTPUT

--构造SQL语句,计算总页数。计算公式为 总页数 = Ceiling ( 记录个数 / 页大小 )
--SET   @sql='SELECT   @intPageCount=CEILING((COUNT(*)+0.0)/' + CAST(@intPageSize   AS   varchar)+ ')   FROM  ' + @strTable + @where1  

--执行SQL语句,计算总页数,并将其放入@intPageCount变量中
--EXEC sp_executesql  @sql, N'@intPageCount   int   OUTPUT', @intPageCount   OUTPUT

set @intPageCount=CEILING ((@count+ 0.0) /@intPageSize)

--如果@intOrder=1为倒序,@intOrder=0为升序
IF @intOrder=1 
	BEGIN
		SET @sql='SELECT TOP ' + CAST(@intPageSize  AS varchar) 
			+  ' * FROM ( SELECT TOP ' + CAST(( @count  - (@intPageSize *  (@intPageNum - 1) ) )  AS varchar)  
		             + @strColumnlist +'  FROM ' + @strtable +  @where1 
			+'ORDER BY '+@orderby1+' DESC) T20070311  ORDER BY ' + @strColumn2
	END
ELSE 
	BEGIN
		SET @sql='SELECT TOP ' + CAST(@intPageSize  AS varchar) 
			+  ' * FROM ( SELECT TOP ' + CAST(( @count  - (@intPageSize *  (@intPageNum - 1) ) )  AS varchar)  
		             + @strColumnlist +'  FROM ' + @strtable +  @where1 
			+'ORDER BY '+@orderby1+' ) T20070311  ORDER BY ' + @strColumn2 + ' DESC'
	END
--print @sql 
EXEC(@sql)
GO

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值