分页存储过程优化--同时返回数据总数

没有MySql般方便的limit分页,在MSSQL中需要分页查询数据的话,就只好写存储过程了。。。

not in方式的分页性能差,创建变量表的方式相对来说,应该要好些。(MSSQL2000)


之前都是获取分页数据、获取数据总数分开写,也就是做两次查询。

某天突然想了想,干脆把这两步操作都写到分页查询里,返回分页数据的同时,把数据总数也返回。

这么做有什么好处呢?

  1、减少一次数据库请求。

  2、查询条件很多时,就只需拼一次SQL了。

  3、方便维护

  4、。。。。。。



这几个理由,足够了,那么就实践吧。

 

-- =============================================
--
Author: Henson
--
Create date: 2011-06-01
--
Description: 根据查询条件返回符合的条件的数据总数及当页数据
--
=============================================
CREATEPROCEDURE[dbo].[ST_GetPagedData]
@MbCdvarchar(12),--会员编号
@MbNamevarchar(20),--会员姓名
@PageSizeint,--每页显示的记录数
@CurrPageint, --当前页索引
@RecordCountint output --总记录数(输出参数)
AS
BEGIN
Declare@strSqlvarchar(4000)
Declare@strWherevarchar(1000)
--根据参数生成Where条件
Set@strWhere=''
If (isnull(@MbCd,'') !='')
Begin
Set@strWhere=@strWhere+' And MB_CD='''+@MbCd+''''
End
If (isnull(@MbName,'') !='')
Begin
Set@strWhere=@strWhere+' And Name like ''%'+@MbName+'%'''
End


--获取记录总数
Declare@strCountSqlnvarchar(1000)
Set@strCountSql='Select @RecordCount=count(*) From M_Account a Where 1=1 '+@strWhere
exec sp_executesql @strCountSql, N'@RecordCount int output',@RecordCount output
--print (@strCountSql)

--获取数据

declare@topIdNumint ,@delNumint
set@topIdNum=@PageSize*@CurrPage
set@delNum= (@CurrPage-1)*@PageSize

set@strSql='
DECLARE @temptb table
(
uid int identity(1,1),
Mb_Cd varchar(12)
)

Insert Into @temptb(Mb_Cd)
Select Top
'+cast( @topIdNumasvarchar(10) )+' a.Mb_Cd,
From M_Account a
Where 1=1
'+@strWhere+N'

delete from @temptb where uid<=
'+cast( @delNumasvarchar(10) )+N'

Select *
From M_Account a
Inner Join @temptb b On a.Mb_Cd=b.Mb_Cd
'

exec (@strSql)

END

 

嗯,就是这样。

然后在调用时,将输出参数的值,也一并获取,就OK了。

(如有不妥或可以完善的地方,还请指出,不胜感激!!!)

posted @ 2011-07-25 16:25  up-Henson  阅读(4278)  评论(9编辑  收藏  举报