使用ROW_NUMBER()的分页存储过程 |
博客分类: SQL |
今天做一个全新的项目的时候用到分页,从以前以前做的项目中找出个分页存储过程,可以直接通过传入表名进行分页的,用到了ROW_NUMBER()函数,所以只适用于MSSQL2005以上,先记下来,以备不时之需。 |
Sql代码 收藏代码 |
-- ============================================= |
-- 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 连接 |
|
C#代码 收藏代码 |
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 '' |