您的位置:首页 > 数据库

SQL Server 分页存储过程

2006-07-26 12:00 309 查看
CREATE PROCEDURE pagination

@tblName varchar(255), -- 表名

@strGetFields varchar(1000) = '*', -- 需要返回的列

@fldName varchar(255)='', -- 排序的字段名

@PageSize int = 10, -- 页尺寸

@PageIndex int = 1, -- 页码

@doCount bit = 0, -- 返回记录总数, 非 0 值则返回

@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序

@strWhere varchar(1500) = '' -- 查询条件 (注意: 不要加 where)

AS

declare @strSQL varchar(5000) -- 主语句

declare @strTmp varchar(110) -- 临时变量

declare @strOrder varchar(400) -- 排序类型

if @doCount != 0

begin

if @strWhere !=''

set @strSQL = 'select count(*) as Total from [' + @tblName + '] where '+@strWhere

else

set @strSQL = 'select count(*) as Total from [' + @tblName + ']'

end

--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况

else

begin

if @OrderType != 0

begin

set @strTmp = '<(select min'

set @strOrder = ' order by [' + @fldName +'] desc'

--如果@OrderType不是0,就执行降序,这句很重要!

end

else

begin

set @strTmp = '>(select max'

set @strOrder = ' order by [' + @fldName +'] asc'

end

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

--以下代码赋予了@strSQL以真正执行的SQL代码

set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from [' + @tblName + ']

where [' + @fldName + ']' + @strTmp + '(['+ @fldName + '])

from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['+ @fldName + ']

from [' + @tblName + ']' + @strOrder + ')

as tblTmp)'+ @strOrder

if @strWhere != ''

set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from [' + @tblName + ']

where [' + @fldName + ']' + @strTmp + '([' + @fldName + '])

from (select top ' + str((@PageIndex-1)*@PageSize) + ' [' + @fldName + ']

from [' + @tblName + ']

where ' + @strWhere + ' ' + @strOrder + ')

as tblTmp) and ' + @strWhere + ' ' + @strOrder

end

end

exec (@strSQL)

GO

/*

-- 需要传递的参数

@tblName varchar(255), -- 表名

@strGetFields varchar(1000) = '*', -- 需要返回的列

@fldName varchar(255)='', -- 排序的字段名

@PageSize int = 10, -- 页尺寸

@PageIndex int = 1, -- 页码

@doCount bit = 0, -- 返回记录总数, 非 0 值则返回

@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序

@strWhere varchar(1500) = '' -- 查询条件 (注意: 不要加 where)

-- 调用测试

exec pagination @tblName='jobs', @strGetFields='job_id,job_desc,min_lvl,max_lvl',

@fldName='job_id',@PageSize=3,@PageIndex=1,

@doCount=0,@OrderType=1,@strWhere=''

*/

============================================

CREATE PROC SP_PageList

@tbname sysname, --要分页显示的表名

@FieldKey sysname, --用于定位记录的主键(惟一键)字段,只能是单个字段

@PageCurrent int=1, --要显示的页码

@PageSize int=10, --每页的大小(记录数)

@FieldShow nvarchar(1000)='', --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段

@FieldOrder nvarchar(1000)='', --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC

--用于指定排序顺序

@Where nvarchar(1000)='', --查询条件

@RecordCount int OUTPUT, --总记录数

@PageCount int OUTPUT --总页数

AS

DECLARE @sql nvarchar(4000)

SET NOCOUNT ON

--检查对象是否有效

IF OBJECT_ID(@tbname) IS NULL

BEGIN

RAISERROR(N'对象"%s"不存在',1,16,@tbname)

RETURN

END

IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0

AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0

AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0

BEGIN

RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)

RETURN

END

--分页字段检查

IF ISNULL(@FieldKey,N'')=''

BEGIN

RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)

RETURN

END

--其他参数检查及规范

IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1

IF ISNULL(@PageSize,0)<1 SET @PageSize=10

IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*'

IF ISNULL(@FieldOrder,N'')=N''

SET @FieldOrder=N''

ELSE

SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder)

IF ISNULL(@Where,N'')=N''

SET @Where=N''

ELSE

SET @Where=N'WHERE ('+@Where+N')'

--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)

IF @PageCount IS NULL

BEGIN

SET @sql=N'SELECT @PageCount=COUNT(*)'

+N' FROM '+@tbname

+N' '+@Where

EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT

SET @RecordCount = @PageCount

SET @PageCount=(@PageCount+@PageSize-1)/@PageSize

END

--计算分页显示的TOPN值

DECLARE @TopN varchar(20),@TopN1 varchar(20)

SELECT @TopN=@PageSize,

@TopN1=@PageCurrent*@PageSize

--第一页直接显示

IF @PageCurrent=1

EXEC(N'SELECT TOP '+@TopN

+N' '+@FieldShow

+N' FROM '+@tbname

+N' '+@Where

+N' '+@FieldOrder)

ELSE

BEGIN

SELECT @PageCurrent=@TopN1,

@sql=N'SELECT @n=@n-1,@s=CASE WHEN @n<'+@TopN

+N' THEN @s+N'',''+QUOTENAME(RTRIM(CAST('+@FieldKey

+N' as varchar(8000))),N'''''''') ELSE N'''' END FROM '+@tbname

+N' '+@Where

+N' '+@FieldOrder

SET ROWCOUNT @PageCurrent

EXEC sp_executesql @sql,

N'@n int,@s nvarchar(4000) OUTPUT',

@PageCurrent,@sql OUTPUT

SET ROWCOUNT 0

IF @sql=N''

EXEC(N'SELECT TOP 0'

+N' '+@FieldShow

+N' FROM '+@tbname)

ELSE

BEGIN

SET @sql=STUFF(@sql,1,1,N'')

--执行查询

EXEC(N'SELECT TOP '+@TopN

+N' '+@FieldShow

+N' FROM '+@tbname

+N' WHERE '+@FieldKey

+N' IN('+@sql

+N') '+@FieldOrder)

END

END

GO
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: