set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
/*
功能描述: 通用分页显示查询
如果有自增标识字段,在@strGetFields中不要加入此字段信息,
如果非要加入的话,要 (fldName + 0) AS fldName 这样处理;
输入参数:
@tblName: 表名
@strGetFields: 需要返回的列 '*':返回所以列信息
@PageSize: 页尺寸
@PageIndex: 页码
@doCount: 返回记录总数, 非 0 值则返回
@strOrderBy: 排序字段信息,(注意: 不要加 ORDER BY)
格式: Field1 DESC, Field2 ASC
@strWhere: 查询条件,(注意: 不要加 WHERE)
输出参数: @RecordCount: 记录总数
作 者: Nestcn
创建时间: 2010-03-09
更改纪录:
*/
ALTER PROCEDURE [ dbo ] . [ MyPagination ]
(
@tblName varchar ( 255 ),
@strGetFields varchar ( 1000 ) = ' * ' ,
@PageSize int = 10 ,
@PageIndex int = 1 ,
@doCount bit = 0 ,
@strOrderBy varchar ( 500 ) = '' ,
@strWhere varchar ( 1500 ) = '' ,
@RecordCount int output
)
AS
-- 主语句
DECLARE @strSQL varchar ( 5000 ) SET @strSQL = ''
-- 排序变量
DECLARE @strOrder varchar ( 400 ) SET @strOrder = ''
SET @RecordCount = 0
-- 如果@doCount传递过来的不是0,就执行总数统计
IF ( @doCount != 0 )
BEGIN
DECLARE @sWhere varchar ( 2000 )
SET @sWhere = ''
IF ( @strWhere != '' )
SET @sWhere = ' WHERE ' + @strWhere
SET @strSQL = ' if exists (select * from dbo.sysobjects where id = object_id( '' [dbo].[tmpTable] '' ) and OBJECTPROPERTY(id, '' IsUserTable '' ) = 1) '
SET @strSQL = @strSQL + ' UPDATE tmpTable SET Total = (SELECT COUNT(*) FROM [ ' + @tblName + ' ] ' + @sWhere + ' ) '
SET @strSQL = @strSQL + ' ELSE SELECT COUNT(*) AS Total INTO tmpTable FROM [ ' + @tblName + ' ] ' + @sWhere
EXEC ( @strSQL )
SELECT @RecordCount = Total FROM tmpTable
-- 删除总数统计临时表
EXEC ( ' DROP TABLE tmpTable ' )
END
PRINT @RecordCount
-- 排序字段信息
IF ( @strOrderBy != '' )
SET @strOrder = ' ORDER BY ' + @strOrderBy
-- 如果是第一页就执行以上代码,这样会加快执行速度
IF ( @PageIndex = 1 )
BEGIN
IF ( @strWhere != '' )
SET @strSQL = ' SELECT TOP ' + str ( @PageSize ) + ' ' + @strGetFields + ' FROM [ ' + @tblName + ' ] WHERE ' + @strWhere + @strOrder
ELSE
SET @strSQL = ' SELECT TOP ' + str ( @PageSize ) + ' ' + @strGetFields + ' FROM [ ' + @tblName + ' ] ' + @strOrder
END
ELSE
BEGIN
-- 为搜索表建立自动编号 保存到临时表中
SET @strSQL = ' SELECT TOP ' + str ( @PageIndex * @PageSize ) + ' IDENTITY(int,1,1) AS IID, ' + @strGetFields + ' INTO #tmpTable FROM [ ' + @tblName + ' ] '
IF ( @strWhere != '' )
SET @strSQL = @strSQL + ' WHERE ' + @strWhere + @strOrder
ELSE
SET @strSQL = @strSQL + @strOrder
-- 以下代码赋予了@strSQL以真正执行的SQL代码
SET @strSQL = @strSQL + ' SELECT ' + @strGetFields + ' FROM #tmpTable WHERE IID > ' + str (( @PageIndex - 1 ) * @PageSize ) + ' DROP TABLE #tmpTable '
END
PRINT @strSQL
-- 执行分页查询
EXEC ( @strSQL )
转摘:实现千万级数据的分页的通用存储过程
最新推荐文章于 2017-08-08 16:57:24 发布