没有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了。

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

作者: 会动的稻草人 发表于 2011-07-25 16:25 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架
新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"