今天做一个全新的项目的时候用到分页,从以前以前做的项目中找出个分页存储过程,可以直接通过传入表名进行分页的,用到了ROW_NUMBER()函数,所以只适用于MSSQL2005以上,先记下来,以备不时之需。
代码
--
=============================================
-- Author: 牛腩
-- Create date: 2009 - 07 - 22 12 : 41
-- Description: 分页,用到了ROW_NUMBER()
-- =============================================
create PROCEDURE [dbo].[proc_ShowPage]
@tblName varchar( 255 ), -- 表名
@strGetFields varchar( 1000 ) = ' * ' , -- 需要返回的列,默认 *
@strOrder varchar( 255 ) = '' , -- 排序的字段名,必填
@strOrderType varchar( 10 ) = ' ASC ' , -- 排序的方式,默认ASC
@PageSize int = 10 , -- 页尺寸,默认10
@PageIndex int = 1 , -- 页码,默认1
@strWhere varchar( 1500 ) = '' -- 查询条件 (注意: 不要加 where )
AS
declare @strSQL varchar( 5000 )
if @strWhere != ''
set @strWhere = ' where ' + @strWhere
set @strSQL =
' SELECT * FROM ( ' +
' SELECT ROW_NUMBER() OVER (ORDER BY ' + @strOrder + ' ' + @strOrderType + ' ) AS pos, ' + @strGetFields + ' ' +
' FROM ' + @tblName + ' ' + @strWhere +
' ) AS sp WHERE pos BETWEEN ' + str((@PageIndex - 1 ) * @PageSize + 1 ) + ' AND ' + str(@PageIndex * @PageSize)
exec (@strSQL)
-- Author: 牛腩
-- Create date: 2009 - 07 - 22 12 : 41
-- Description: 分页,用到了ROW_NUMBER()
-- =============================================
create PROCEDURE [dbo].[proc_ShowPage]
@tblName varchar( 255 ), -- 表名
@strGetFields varchar( 1000 ) = ' * ' , -- 需要返回的列,默认 *
@strOrder varchar( 255 ) = '' , -- 排序的字段名,必填
@strOrderType varchar( 10 ) = ' ASC ' , -- 排序的方式,默认ASC
@PageSize int = 10 , -- 页尺寸,默认10
@PageIndex int = 1 , -- 页码,默认1
@strWhere varchar( 1500 ) = '' -- 查询条件 (注意: 不要加 where )
AS
declare @strSQL varchar( 5000 )
if @strWhere != ''
set @strWhere = ' where ' + @strWhere
set @strSQL =
' SELECT * FROM ( ' +
' SELECT ROW_NUMBER() OVER (ORDER BY ' + @strOrder + ' ' + @strOrderType + ' ) AS pos, ' + @strGetFields + ' ' +
' FROM ' + @tblName + ' ' + @strWhere +
' ) AS sp WHERE pos BETWEEN ' + str((@PageIndex - 1 ) * @PageSize + 1 ) + ' AND ' + str(@PageIndex * @PageSize)
exec (@strSQL)
下面是调用的示例,这里可以采用join连接
代码
EXEC
[
proc_ShowPage
]
@tblName = N ' (project p inner join projectca ca on p.caid=ca.id) ' ,
@strGetFields = N ' p.title,ca.caname ' ,
@strOrder = N ' p.id ' ,
@strOrderType = N ' desc ' ,
@PageSize = 12 ,
@PageIndex = 1 ,
@strWhere = N ''
@tblName = N ' (project p inner join projectca ca on p.caid=ca.id) ' ,
@strGetFields = N ' p.title,ca.caname ' ,
@strOrder = N ' p.id ' ,
@strOrderType = N ' desc ' ,
@PageSize = 12 ,
@PageIndex = 1 ,
@strWhere = N ''