首页 > sql server 2005分页存储过程和sql server 2000分页存储过程(摘)

sql server 2005分页存储过程和sql server 2000分页存储过程(摘)

USE [svnhost]



GO



/****** 对象:  StoredProcedure [dbo].[up_Page2005]    脚本日期: 05/21/2008 11:27:05 ******/



SET ANSI_NULLS ON



GO



SET QUOTED_IDENTIFIER ON



GO







CREATE proc [dbo].[up_Page2005]



@TableName varchar(50),        --表名



@Fields varchar(5000) = '*',    --字段名(全部字段为*)



@OrderField varchar(5000),        --排序字段(必须!支持多字段)



@sqlWhere varchar(5000) = Null,--条件语句(不用加where)



@pageSize int,                    --每页多少条记录



@pageIndex int = 1 ,            --指定当前为第几页



@TotalPage int output            --返回总页数



as



begin







   
Begin Tran --开始事务







   
Declare @sql nvarchar(4000);



   
Declare @totalRecord int;   







   
--计算总记录数



        



   
if (@SqlWhere='' or @sqlWhere=NULL)



       
set @sql = 'select @totalRecord = count(*) from ' + @TableName



   
else



       
set @sql = 'select @totalRecord = count(*) from ' + @TableName + ' with(nolock) where ' + @sqlWhere







   
EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数       



   



   
--计算总页数



    select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)







   
if (@SqlWhere='' or @sqlWhere=NULL)



       
set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName



   
else



       
set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName + ' with(nolock) where ' + @SqlWhere   



       







   
--处理页数超出范围情况



    if @PageIndex<=0



       
Set @pageIndex = 1



   



   
if @pageIndex>@TotalPage



       
Set @pageIndex = @TotalPage







    
--处理开始点和结束点



    Declare @StartRecord int



   
Declare @EndRecord int



   



   
set @StartRecord = (@pageIndex-1)*@PageSize + 1



   
set @EndRecord = @StartRecord + @pageSize - 1







   
--继续合成sql语句



    set @Sql = @Sql + ') as t where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' +  Convert(varchar(50),@EndRecord)



    
print @sql  



   
Exec(@Sql)



   
---------------------------------------------------



    If @@Error <> 0



     
Begin



       
RollBack Tran



       
Return -1



     
End



    
Else



     
Begin



       
Commit Tran



       
Return @totalRecord ---返回记录总数



      End   



end























GO



/****** 对象:  StoredProcedure [dbo].[up_Page2005V2]    脚本日期: 05/21/2008 11:27:15 ******/



SET ANSI_NULLS ON



GO



SET QUOTED_IDENTIFIER ON



GO



-- =============================================



--
Author:       



--
Create date:



--
Description:   



--
=============================================



CREATE PROCEDURE [dbo].[up_Page2005V2]



   
@TableName varchar(50),        --表名



@Fields varchar(5000) = '*',    --字段名(全部字段为*)



@OrderField varchar(5000),        --排序字段(必须!支持多字段)



@sqlWhere varchar(5000) = Null,--条件语句(不用加where)



@pageSize int,                    --每页多少条记录



@pageIndex int = 1 ,            --指定当前为第几页



@totalRecord int = 0,



@TotalPage int output            --返回总页数



AS



BEGIN



   



    
Begin Tran --开始事务







   
Declare @sql nvarchar(4000);







   
if @totalRecord<=0 begin



       
--计算总记录数



            



       
if (@SqlWhere='' or @sqlWhere=NULL)



           
set @sql = 'select @totalRecord = count(*) from ' + @TableName



       
else



           
set @sql = 'select @totalRecord = count(*) from ' + @TableName + ' with(nolock) where ' + @sqlWhere







       
EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数      



    end







   
--计算总页数



    select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)







   
if (@SqlWhere='' or @sqlWhere=NULL)



       
set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName



   
else



       
set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName + ' with(nolock) where ' + @SqlWhere   



       







   
--处理页数超出范围情况



    if @PageIndex<=0



       
Set @pageIndex = 1



   



   
if @pageIndex>@TotalPage



       
Set @pageIndex = @TotalPage







    
--处理开始点和结束点



    Declare @StartRecord int



   
Declare @EndRecord int



   



   
set @StartRecord = (@pageIndex-1)*@PageSize + 1



   
set @EndRecord = @StartRecord + @pageSize - 1







   
--继续合成sql语句



    set @Sql = @Sql + ') as t where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' +  Convert(varchar(50),@EndRecord)



    
print @sql  



   
Exec(@Sql)



   
---------------------------------------------------



    If @@Error <> 0



     
Begin



       
RollBack Tran



       
Return -1



     
End



    
Else



     
Begin



       
Commit Tran



       
Return @totalRecord ---返回记录总数



      End  



END











GO



/****** 对象:  StoredProcedure [dbo].[up_Page2005V2_Join]    脚本日期: 05/21/2008 11:27:30 ******/



SET ANSI_NULLS ON



GO



SET QUOTED_IDENTIFIER ON



GO



-- =============================================



--
Author:       



--
Create date:



--
Description:   



--
=============================================



CREATE PROCEDURE [dbo].[up_Page2005V2_Join]



   
@TableName varchar(150),        --表名



@Fields varchar(5000) = '*',    --字段名(全部字段为*)



@OrderField varchar(5000),        --排序字段(必须!支持多字段)



@sqlWhere varchar(5000) = Null,--条件语句(不用加where)



@pageSize int,                    --每页多少条记录



@pageIndex int = 1 ,            --指定当前为第几页



@totalRecord int = 0,



@TotalPage int output            --返回总页数



AS



BEGIN



   



    
Begin Tran --开始事务







   
Declare @sql nvarchar(4000);







   
if @totalRecord<=0 begin



       
--计算总记录数



            



       
if (@SqlWhere='' or @sqlWhere=NULL)



           
set @sql = 'select @totalRecord = count(*) from ' + @TableName



       
else



           
set @sql = 'select @totalRecord = count(*) from ' + @TableName + '  where ' + @sqlWhere







       
EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数      



    end







   
--计算总页数



    select @TotalPage=CEILING((@totalRecord+0.0)/@PageSize)







   
if (@SqlWhere='' or @sqlWhere=NULL)



       
set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName



   
else



       
set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @OrderField + ') as rowId,' + @Fields + ' from ' + @TableName + ' where ' + @SqlWhere   



       







   
--处理页数超出范围情况



    if @PageIndex<=0



       
Set @pageIndex = 1



   



   
if @pageIndex>@TotalPage



       
Set @pageIndex = @TotalPage







    
--处理开始点和结束点



    Declare @StartRecord int



   
Declare @EndRecord int



   



   
set @StartRecord = (@pageIndex-1)*@PageSize + 1



   
set @EndRecord = @StartRecord + @pageSize - 1







   
--继续合成sql语句



    set @Sql = @Sql + ') as t where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' +  Convert(varchar(50),@EndRecord)



    
print @sql







   
Exec(@Sql)



   
---------------------------------------------------



    If @@Error <> 0



     
Begin



       
RollBack Tran



       
Return -1



     
End



    
Else



     
Begin



       
Commit Tran



       
Return @totalRecord ---返回记录总数



      End  



END







 

 

USE [game]

GO

/****** 对象: StoredProcedure [dbo].[page] 脚本日期: 05/21/2008 11:37:12 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO



CREATE proc [dbo].[page]

@RecordCount int output,

@ReturnCount bit,

@QueryStr nvarchar(1000)='table1',--表名、视图名、查询语句

@PageSize int=20, --每页的大小(行数)

@PageCurrent int=2, --要显示的页 从0开始

@FdShow nvarchar (2000)='*', --要显示的字段列表

@IdentityStr nvarchar (100)='id', --主键

@WhereStr nvarchar (2000)='1=1',

@FdOrder nvarchar(100)='desc' --排序 只能取desc或者asc

as



set nocount on



declare



@sql nvarchar(2000)





if @WhereStr = '' begin

set @WhereStr = '1=1'

end



if @ReturnCount=1 begin

declare @tsql nvarchar(200)

set @tsql=N'select @RecordCount = count(*) from ' + @QueryStr + ' where ' + @WhereStr

exec sp_executesql @tsql,N'@RecordCount int output',@RecordCount output

end



if @PageCurrent = 0 begin

set @sql = 'select top ' + cast(@PageSize as nvarchar(3)) + ' ' + @FdShow + ' from ' + @QueryStr + ' where ' + @WhereStr + ' order by ' + @IdentityStr + ' ' + @FdOrder

end



else begin

if upper(@FdOrder) = 'DESC' begin

set @sql = 'select top ' + cast(@PageSize as nvarchar(3)) + ' ' + @FdShow + ' from ' + @QueryStr + ' where ' + @WhereStr + ' and ' + @IdentityStr + '< ( select min(' + @IdentityStr + ') from (select top ' + cast(@PageSize*@PageCurrent as nvarchar(10)) + ' ' + @IdentityStr + ' from ' + @QueryStr + ' where ' + @WhereStr + ' order by ' + @IdentityStr + ' desc) as t) order by ' + @IdentityStr + ' desc'

end

else begin

set @sql = 'select top ' + cast(@PageSize as nvarchar(3)) + ' ' + @FdShow + ' from ' + @QueryStr + ' where ' + @WhereStr + ' and ' + @IdentityStr + '> ( select max(' + @IdentityStr + ') from (select top ' + cast(@PageSize*@PageCurrent as nvarchar(10)) + ' ' + @IdentityStr + ' from ' + @QueryStr + ' where ' + @WhereStr + ' order by ' + @IdentityStr + ' asc) as t) order by ' + @IdentityStr + ' asc'

end

end

--print @sql

execute(@sql)

--select @t = datediff(ms,@t1,getdate())---------------------

转载于:https://www.cnblogs.com/piwxsz/archive/2008/06/10/1216915.html

更多相关:

  • 1. set的初始化 set可以这样初始化 set iset{ 1,2,3 }; set iset2 = { 1,2,3 }; 在初始化set的时候,若出现重复的元素 set iset3{ 1,2,3,3,3 }; set iset4 = { 1,2,3,3,3 };...

  •     Set 对象存储的值总是唯一的 Set 对象方法 方法描述add添加某个值,返回Set对象本身。clear删除所有的键/值对,没有返回值。delete删除某个键,返回true。如果删除失败,返回false。forEach对每个元素执行指定操作。has返回一个布尔值,表示某个键是否在当前 Set 对象之中。 Set 对象...

  • 我现在的vimrc配置文件 runtime! debian.vim "设置编码 set encoding=utf-8 set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936 set fileencodings=utf-8,ucs-bom,chinese"语言设置...

  • ACCEPT acm作业 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=204 因为老师是在集合那里要我们做这道题。所以我很是天真的就以为要用集合做,结果发现网上都是用数组简单明了地实现了,显得我的代码,特么地超级恶心!!!!!!! 在这里存档一下,别人就不要看了...

  • --sql语句就用下面的存储过程 /*--数据导出Excel 导出查询中的数据到Excel,包含字段名,文件为真正的Excel文件,如果文件不存在,将自动创建文件,如果表不存在,将自动创建表基于通用性考虑,仅支持导出标准数据类型 使用方法: 直接复制执行创建储存过程--陈润程 2014.04--*/ /*--调用示例 p_export...

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...