存储过程分页-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