没有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了。
(如有不妥或可以完善的地方,还请指出,不胜感激!!!)