一、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