SQL SERVER中,两种比较高效的分页方式

一、SQL SERVER 2012及以上版本

1.语法示例

DECLARE @PageSize INT = 10	--分页显示数据行数
DECLARE @PageIndex INT = 1	--页码 
DECLARE @NoRows INT
SET @NoRows = (@PageIndex-1)+@PageSize --需要舍弃的行数
SELECT * --查询列
FROM AddressBook_GroupPerson --查询表
WHERE 1=1 --查询条件
ORDER BY ID DESC --排序
OFFSET @NoRows ROWS --舍弃行
FETCH NEXT @PageSize ROWS ONLY --继续往下读取行

2.分页存储过程

CREATE PROCEDURE [dbo].[UP_SplicPage]
@TableName VARCHAR(MAX) = '',	--表名
@GetFields VARCHAR(MAX) = '*',	--需要返回的列
@OrderBy VARCHAR(500),	--排序的字段名
@KeyID VARCHAR(50),	--主键字段或其他建立索引字段
@PageSize INT = 10,	--页面尺寸
@PageIndex INT = 1,	--页码   
@StrWhere VARCHAR(MAX) = '',--查询条件(不需加where)
@TotalCount INT OUTPUT --返回总行数
AS
BEGIN
	SET NOCOUNT ON;
	DECLARE @SQL NVARCHAR(MAX),@SQLCount NVARCHAR(MAX),@NotPageSize VARCHAR(50)
	--排序
	IF @OrderBy='' SET @OrderBy=' ORDER BY ['+@KeyID+'] DESC '
	ELSE SET @OrderBy = ' ORDER BY ' + @OrderBy
	--查询条件
	IF @StrWhere='' SET @StrWhere=' 1=1 '

	------获取分页数据-----------
	SET @NotPageSize= CONVERT(VARCHAR(50),(@PageIndex-1)*@PageSize)
	SET @SQL='SELECT '+@GetFields+' FROM '+@TableName+' WHERE '+@StrWhere+' '+@OrderBy
	SET @SQL+=' OFFSET '+@NotPageSize+' ROWS' --舍去的行数
	SET @SQL+=' FETCH NEXT '+CONVERT(VARCHAR,@PageSize)+' ROWS ONLY' --舍去后,再向后读取的行数
	--PRINT @SQL
	EXEC(@SQL)
	-----------------------------

	------获取表中有好多行-------
	SET @SQLCount='SELECT @COUNT=COUNT(1) FROM '+@TableName+' WHERE '+@StrWhere
	--PRINT @SQLCount
	EXEC SP_EXECUTESQL @SQLCount,N'@COUNT INT OUT', @TotalCount OUT 
	-----------------------------

	--注意,表名@TableName可取:
	--1.表名
	--2.视图
	--3. (SELECT * FROM TABLE1)A
END

二、曾经常用

1.语法示例

DECLARE @PageSize INT = 10 --分页显示数据行数
DECLARE @PageIndex INT = 1 --页码 
DECLARE @StartIndex INT,@EndIndex INT
SET @StartIndex=((@PageIndex-1)*@PageSize)+1 --起始行
SET @EndIndex=@PageSize*@PageIndex --结束行
SELECT * --查询列
FROM (
SELECT ROW_NUMBER() OVER(ORDER BY ID)RowID --排序
,* 
FROM AddressBook_GroupPerson --查询表
WHERE 1=1 --查询条件
)A 
WHERE RowID BETWEEN @StartIndex AND @EndIndex

2.分页存储过程

CREATE PROCEDURE [dbo].[UP_SplicPage2]
@TableName VARCHAR(MAX) = '',	--表名
@GetFields VARCHAR(MAX) = '*',	--需要返回的列
@OrderBy VARCHAR(500),	--排序的字段名
@KeyID VARCHAR(50),	--主键字段或其他建立索引字段
@PageSize INT = 10,	--页面尺寸
@PageIndex INT = 1,	--页码   
@StrWhere VARCHAR(MAX) = '',--查询条件(不需加where)
@TotalCount INT OUTPUT --返回总行数
AS
BEGIN
	SET NOCOUNT ON;
	DECLARE @SQL NVARCHAR(MAX),@SQLCount NVARCHAR(MAX),@TempTableName VARCHAR(MAX),@StartIndex INT,@EndIndex INT
	--排序
	IF @OrderBy='' SET @OrderBy=' ORDER BY ['+@KeyID+'] DESC '
	ELSE SET @OrderBy = ' ORDER BY ' + @OrderBy
	--查询条件
	IF @StrWhere='' SET @StrWhere=' 1=1 '
	--生产行号表
	SET @TempTableName = '( SELECT ROW_NUMBER() OVER (' + @OrderBy +' )AS RowID,*  FROM '+@TableName+' WHERE '+@StrWhere+' ) as TempTable'
	--获取分页起始和终止行号
	SET @StartIndex = ((@PageIndex - 1) * @PageSize) + 1 --起
	SET @EndIndex = @PageIndex * @PageSize --终

	------获取分页数据-----------
	SET @SQL='SELECT '+@GetFields+' FROM '+@TempTableName+' WHERE RowID BETWEEN '+CONVERT(VARCHAR(50),@StartIndex)+' AND '+CONVERT(VARCHAR(50),@EndIndex)
	--PRINT @SQL
	EXEC(@SQL)
	-----------------------------

	------获取表中有好多行-------
	SET @SQLCount='SELECT @COUNT=COUNT(1) FROM '+@TableName+' WHERE '+@StrWhere
	--PRINT @SQLCount
	EXEC SP_EXECUTESQL @SQLCount,N'@COUNT INT OUT', @TotalCount OUT 
	-----------------------------

	--注意,表名@TableName可取:
	--1.表名
	--2.视图
	--3. (SELECT * FROM TABLE1)A
END

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值