下面是一个支持任意表的 SQL SERVER2000分页存储过程
1 下面是一个支持任意表的 SQL SERVER2000分页存储过程 2 //-----下面是一个支持任意表的 SQL SERVER2000分页存储过程 3 4 //----分页存储过程开始创建----------------------------------------------------------------------------------------------------------- 5 IF EXISTS (SELECT name FROM sysobjects WHERE name = 'PageShowOne' AND type = 'P') 6 DROP PROCEDURE PageShowOne 7 GO 8 9 CREATE Proc PageShowOne 10 @PageSize int=10 ,--每页显示的记录数 11 @PageCurrent int=1 ,--当前要显示的页号 12 @FdName varchar(100)='' ,--主键名或者标识列名 13 @SelectStr varchar(2000)='', --select子句,不包含select关键字,如:*或者Id,UserId,UserName等。 14 @FromStr varchar(1000)='', --from子句,不包含from关键子,如:myTable或者myTable,yourTable 15 @WhereStr varchar(2000)='', --Where子句,不包含where关键字,如空的,或者 id>2 等 16 @OrderByStr varchar(1000)='',--order by 子句,不包含order by 子句 ,如id desc,UserId asc 等 17 @CountRows int=0 output, --返回记录总数 18 @CountPage int=0 output --返回总页数 19 as 20 --------定义局部变量--------- 21 declare @Id1 varchar(20),@Id2 varchar(20) --开始和结束的记录号 22 declare @OrderBySqls varchar(1000) --order by 子句 23 declare @WhereSqls varchar(2000) --where 子句 24 declare @Sqls nvarchar(4000) --最终组合成的Sqls语句 25 declare @TmpStr varchar(2000) --临时 26 ---------------------------- 27 if @OrderByStr <> '' 28 set @OrderBySqls = ' order by '+@OrderByStr 29 else 30 set @OrderBySqls = '' 31 -------- 32 if @WhereStr <> '' 33 set @WhereSqls = ' where ('+@WhereStr+')' 34 else 35 set @WhereSqls = '' 36 -------- 37 set @TmpStr = @WhereSqls 38 --如果显示第一页,可以直接用top来完成 39 if @PageCurrent<=1 40 begin 41 select @Id1=cast(@PageSize as varchar(20)) 42 exec('select top '+@Id1+' '+@SelectStr+' from '+@FromStr+@WhereSqls+@OrderBySqls) 43 goto LabelRes 44 end 45 --------------------------- 46 select @Id1=cast(@PageSize as varchar(20)) 47 ,@Id2=cast((@PageCurrent-1)*@PageSize as varchar(20)) 48 ---------- 49 if @WhereSqls <> '' 50 set @WhereSqls = @WhereSqls + ' and (' + @FdName+' not in(select top '+@Id2+' '+@FdName+' from '+@FromStr+@WhereSqls+@OrderBySqls+'))' 51 else 52 set @WhereSqls = ' where ' + @FdName+' not in(select top '+@Id2+' '+@FdName+' from '+@FromStr+@WhereSqls+@OrderBySqls+')' 53 ---------- 54 set @Sqls = 'select top '+@Id1+ ' '+ @SelectStr+' from '+@FromStr+@WhereSqls+@OrderBySqls 55 exec (@Sqls) 56 ----------- 57 LabelRes: 58 -----返回总记录数 59 set @Sqls = 'select @a=count(1) from '+@FromStr+@TmpStr 60 exec sp_executesql @sqls,N'@a int output',@CountRows output 61 -----返回总页数 62 if @CountRows <= @PageSize 63 set @CountPage = 1 64 else 65 begin 66 set @CountPage = @CountRows/@PageSize 67 if (@CountRows%@PageSize) > 0 68 set @CountPage = @CountPage + 1 69 end 70 return 71 GO
-Delphi7调用过程开始
1 //----Delphi7调用过程开始---------------------------------------------------------------------------------------- 2 3 首先在 public 中定义 i, RsCount: integer; 4 在frmMain中放置一个dbgrid , datasource, AdoStoredProc [name->sp], 和4个 Button, 设置好相关连接! 5 6 procedure TfrmMain.btnFirstClick(Sender: TObject); 7 begin 8 i := 1; 9 sp.ProcedureName := 'PageShowOne;1'; 10 sp.Close; 11 sp.Parameters.ParamByName('@PageSize').Value := 50; 12 sp.Parameters.ParamByName('@PageCurrent').Value := i; 13 sp.Parameters.ParamByName('@FdName').Value := '图纸编号'; 14 sp.Parameters.ParamByName('@SelectStr').Value := '图纸编号,模具形状一,模具形状二,模具形状三,最大高度,最大宽度,重量,有无波面,螺丝孔数'; 15 sp.Parameters.ParamByName('@FromStr').Value := 'tuzhi'; 16 sp.Parameters.ParamByName('@WhereStr').Value := ''; 17 sp.Parameters.ParamByName('@OrderByStr').Value := '日期'; 18 sp.Open; 19 Label1.Caption := '记录总数:'+IntToStr(sp.Parameters.ParamValues['@CountRows']); 20 Label2.Caption := '总页数:'+IntToStr(sp.Parameters.ParamValues['@CountPage']); 21 RsCount := sp.Parameters.ParamValues['@CountPage']; 22 Label3.Caption := '第 '+IntToStr(i)+ ' 页'; 23 end; 24 25 procedure TfrmMain.btnNextClick(Sender: TObject); 26 begin 27 if i >= RsCount then 28 ShowMessage('已经是最后一页!') 29 else 30 i := i + 1; 31 sp.ProcedureName := 'PageShowOne;1'; 32 sp.Close; 33 sp.Parameters.ParamByName('@PageSize').Value := 50; 34 sp.Parameters.ParamByName('@PageCurrent').Value := i; 35 sp.Parameters.ParamByName('@FdName').Value := '图纸编号'; 36 sp.Parameters.ParamByName('@SelectStr').Value := '图纸编号,模具形状一,模具形状二,模具形状三,最大高度,最大宽度,重量,有无波面,螺丝孔数'; 37 sp.Parameters.ParamByName('@FromStr').Value := 'tuzhi'; 38 sp.Parameters.ParamByName('@WhereStr').Value := ''; 39 sp.Parameters.ParamByName('@OrderByStr').Value := '日期'; 40 sp.Open; 41 Label3.Caption := '第 '+IntToStr(i)+ ' 页'; 42 end; 43 44 procedure TfrmMain.btnPriorClick(Sender: TObject); 45 begin 46 if i > 1 then 47 i := i - 1 48 else ShowMessage('已经是第一页了!'); 49 sp.ProcedureName := 'PageShowOne;1'; 50 sp.Close; 51 sp.Parameters.ParamByName('@PageSize').Value := 50; 52 sp.Parameters.ParamByName('@PageCurrent').Value := i; 53 sp.Parameters.ParamByName('@FdName').Value := '图纸编号'; 54 sp.Parameters.ParamByName('@SelectStr').Value := '图纸编号,模具形状一,模具形状二,模具形状三,最大高度,最大宽度,重量,有无波面,螺丝孔数'; 55 sp.Parameters.ParamByName('@FromStr').Value := 'tuzhi'; 56 sp.Parameters.ParamByName('@WhereStr').Value := ''; 57 sp.Parameters.ParamByName('@OrderByStr').Value := '日期'; 58 sp.Open; 59 Label3.Caption := '第 '+IntToStr(i)+ ' 页'; 60 end; 61 62 procedure TfrmMain.btnLastClick(Sender: TObject); 63 begin 64 i := RsCount; 65 sp.ProcedureName := 'PageShowOne;1'; 66 sp.Close; 67 sp.Parameters.ParamByName('@PageSize').Value := 50; 68 sp.Parameters.ParamByName('@PageCurrent').Value := i; 69 sp.Parameters.ParamByName('@FdName').Value := '图纸编号'; 70 sp.Parameters.ParamByName('@SelectStr').Value := '图纸编号,模具形状一,模具形状二,模具形状三,最大高度,最大宽度,重量,有无波面,螺丝孔数'; 71 sp.Parameters.ParamByName('@FromStr').Value := 'tuzhi'; 72 sp.Parameters.ParamByName('@WhereStr').Value := ''; 73 sp.Parameters.ParamByName('@OrderByStr').Value := '日期'; 74 sp.Open; 75 Label3.Caption := '第 '+IntToStr(i)+ ' 页'; 76 end; 77 //--------------调用结束-------------------------------------------------------------------------------------------------------------------