在使用列表页面往往会涉及到分页,然而现在以easyui的列表插件为主,easyui的列表都自带有分页,但是体现分页效果并不仅仅是分页插件,更多的在于分页时对数据的查找,数据库SQL分页在列表呈现中就体现出了其重要性,以前用过的分页存储过程有很多,都是涉及算法,自己在存储过程里面进行计算,用的最多的就是用ROW_NUMBER()进行数据分页处理,今天我并不是用ROW_NUMBER()来分页,利用OFFSET FETCH NEXT分页这是
SQL Server 2012新方法
对于测试表我这里就不展示了
code:
CREATE PROCEDURE [dbo].[PagingStorageQuery]
@TableName NVARCHAR(100), --数据源对象[表名、视图名]<必填>
@QueryTerm NVARCHAR(MAX), --查询条件
@PageIndex INT, --索引页<必填>
@PageSize INT, --页面条数<必填>
@SortField NVARCHAR(50), --排序字段<必填>
@Sort INT, --排序方式[0.ASC<升序 默认> 1.DESC<降序>]
@DisplayField NVARCHAR(MAX), --显示字段[默认*]
@IsRowNumber INT=NULL, --是否开始RowNumber[默认不开启,0.不开启 1.开启]
@RowCount INT=NULL OUTPUT --数据总数
AS
BEGIN
SET NOCOUNT ON;
DECLARE @QueryString NVARCHAR(MAX) --查询条件
DECLARE @StartRowNumber NVARCHAR(10) --开始查询条数
DECLARE @SortSql NVARCHAR(100) --排序Sql
DECLARE @SqlString NVARCHAR(MAX) --执行SqlString
DECLARE @SqlCount NVARCHAR(MAX) --执行SqlCount
--初始化查询条件
SET @QueryString=' WHERE 1=1 '
--初始化开始查询条件
SET @StartRowNumber=((@PageIndex-1)*@PageSize)
--判断是否存在排序
IF(ISNULL(@SortField,'')<>'')
BEGIN
IF(@Sort=1)
SET @SortSql=' ORDER BY '+@SortField+' DESC'
ELSE
SET @SortSql=' ORDER BY '+@SortField+' ASC'
END
--判断查询条件是否存在
IF(ISNULL(@QueryTerm,'')<>'')
SET @QueryString=@QueryString+' AND '+@QueryTerm
--判断显示字段是否存在
IF(ISNULL(@DisplayField,'')='')
SET @DisplayField='*'
--判断数据源对象是否存在
IF(ISNULL(@TableName,'')<>'')
BEGIN
--总记录数
SET @SqlCount = 'SELECT @tempCount = COUNT(*) FROM ' + @TableName+@QueryString
IF(@IsRowNumber=1)
BEGIN
SET @SqlString='SELECT ROW_NUMBER() OVER('+ISNULL(@SortSql,'')+') as RowNumber,* FROM (
SELECT '+@DisplayField+' FROM '+@TableName+@QueryString+ISNULL(@SortSql,'') +' OFFSET '
+CONVERT(NVARCHAR(10),@StartRowNumber)+' ROWS FETCH NEXT '+CONVERT(NVARCHAR(10),@PageSize)+' ROWS ONLY) AS A'
END
ELSE
BEGIN
SET @SqlString='SELECT '+@DisplayField+' FROM '+@TableName+@QueryString+ISNULL(@SortSql,'') +' OFFSET '
+CONVERT(NVARCHAR(10),@StartRowNumber)+' ROWS FETCH NEXT '+CONVERT(NVARCHAR(10),@PageSize)+' ROWS ONLY'
END
PRINT @SqlString
PRINT @SqlCount
EXEC(@SqlString)
EXECUTE SP_EXECUTESQL @SqlCount,N'@tempCount BIGINT OUTPUT',@tempCount = @RowCount OUTPUT;
END
END
注:上面标注的必填项不能为空,否则存储过程会报错,以上代码直接复制可用