mssql 存储过程分页(同时返回总页数)
没有MySql般方便的limit分页,在MSSQL中需要分页查询数据的话,就只好写存储过程了。。。
not in方式的分页性能差,创建变量表的方式相对来说,应该要好些。(MSSQL2000)
之前都是获取分页数据、获取数据总数分开写,也就是做两次查询。
某天突然想了想,干脆把这两步操作都写到分页查询里,返回分页数据的同时,把数据总数也返回。
这么做有什么好处呢?
1、减少一次数据库教程请求。
2、查询条件很多时,就只需拼一次SQL了。
3、方便维护
4、。。。。。。
这几个理由,足够了,那么就实践吧。
-- =============================================
-- Author: Henson
-- Create date: 2011-06-01
-- Description: 根据查询条件返回符合的条件的数据总数及当页数据
-- =============================================
CREATE PROCEDURE [dbo].[ST_GetPagedData]
@MbCd varchar(12),--会员编号
@MbName varchar(20),--会员姓名
@PageSize int,--每页显示的记录数
@CurrPage int, --当前页索引
@RecordCount int output --总记录数(输出参数)
AS
BEGIN
Declare @strSql varchar(4000)
Declare @strWhere varchar(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 @strCountSql nvarchar(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 @topIdNum int ,@delNum int
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( @topIdNum as varchar(10) )+' a.Mb_Cd,
From M_Account a
Where 1=1 '+@strWhere+N'
delete from @temptb where uid<='+ cast( @delNum as varchar(10) )+N'
Select *
From M_Account a
Inner Join @temptb b On a.Mb_Cd=b.Mb_Cd
'
exec (@strSql)
END
嗯,就是这样。
然后在调用时,将输出参数的值,也一并获取,就OK了