存储过程分页-sql2005

针对于sql的存储过程分页

在做这个存储过程的时候

测试了 用  not in 和 ROW_NUMBER()over(order by t1.Gps_No) as idx 的  between 范围的取数 性能。

 在1000记录一下时候的

在用not in 时候 分页不会感觉卡 但是在一个瓶颈(最后一页上只有一条记录)上确取了 3分半才出结果

用ROW_NUMBER()没有发现这类问题。

在6000条的时候

发现2种都不是很快,所以决定用索引。测试结果很满意!

 @ssql 传入 sql语句 如select * from 表1  (也可以是多表联合查询的语句)

 @sql_key 用于分页的主键

 @nowpage  当前页

 @pagesize 每页的记录数

ALTER  PROCEDURE [dbo].[DataPaging]
 -- Add the parameters for the stored procedure here
 @ssql varchar(4000),
 @sql_key    varchar(20),   --用于分页的主键
 @nowpage int,
 @pagesize int,
 @pages int output
AS
BEGIN
 -- SET NOCOUNT ON added to prevent extra result sets from
 -- interfering with SELECT statements.
 SET NOCOUNT ON;
 Declare @sqlcount Int,@sqlcount1 Int,@sql nvarchar(4000)
 Begin Tran
  
  SET @sql=N'SELECT @sqlcount=COUNT(*) FROM ('+@ssql+') as temp'
  EXEC sp_executesql @sql,N'@sqlcount int OUTPUT',@sqlcount1 OUTPUT--计算总记录数
  SELECT @pages=CEILING((@sqlcount1+0.0)/@pagesize)                 --计算总页数
  --print @pages
  
  IF @nowpage=1--第一页
  BEGIN
     SET @sql='SELECT TOP '+CAST(@pagesize AS varchar(10))+' *  FROM ('+@ssql+') as temp'
  END
  else
  begin

--1. not in  方式
   --SET @sql='SELECT TOP '+CAST(@pagesize AS varchar(10))+' *  FROM ('+@ssql+') as temp where '+@sql_key+' not in (Select Top '+CAST((@pagesize*(@nowpage-1)) AS varchar(10))+' '+@sql_key+' from ('+@ssql+') as temp) '

--2.ROW_NUMBER()over(order by t1.Gps_No) as idx 方式

-----------------------------------------------------------------------------------
   SET @ssql='Select * from (SELECT ROW_NUMBER()over(order by t1.Gps_No) as idx,t1.* FROM ('+@ssql+')  as t1) as tt where idx between '+CAST((@pagesize*(@nowpage-1)) AS varchar(10))+' and '+CAST((@pagesize*@nowpage) AS varchar(10))+''
  
  end
  --print @sql
  EXEC(@sql)
  If @@Error <> 0
  Begin
    RollBack Tran
    print -1
  End
  Else
  Begin
    Commit Tran
    Return @pages
  End

posted @ 2011-05-31 17:22  zhaosazi77  阅读(323)  评论(0编辑  收藏  举报