SqlServer 2000、2005分页存储过程整理第1/3页

sql server 2005的分页存储过程分3个版本,一个是没有优化过的,一个是优化过的,最后一个支持join的,sql server 2000的分页存储过程,也可以运行在sql server 2005上,但是性能没有sql server 2005的版本好。

在最后 我还附带了一个二分法的分页存储过程,也很好用的说哈~~

1.sqlserver 2005:

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

2.sql server 2005:

/****** 对象: storedprocedure [dbo].[up_page2005v2]  脚本日期: 05/21/2008 11:27:15 ******/
set ansi_nulls on
go
set quoted_identifier on
go
-- =============================================
-- author:    <author,,name>
-- create date: <create date,,>
-- description:  <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

3.sql server 2005:

/****** 对象: storedprocedure [dbo].[up_page2005v2_join]  脚本日期: 05/21/2008 11:27:30 ******/
set ansi_nulls on
go
set quoted_identifier on
go
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

4.sql server 2000:

use [game]
go
/****** 对象: storedprocedure [dbo].
            123下一页阅读全文
            
您可能感兴趣的文章:sqlserver存储过程中事务的使用方法sql server调用存储过程小结五种sql server分页存储过程的方法及性能比较sql server存储过程中使用表值作为输入参数示例深入分析sql server 存储过程java中调用sql server存储过程详解谈谈sqlserver自定义函数与存储过程的区别sql server 2008 存储过程示例sqlserver用存储过程实现插入更新数据示例c#实现sqlserver事务处理示例sql server存储过程中编写事务处理的方法小结




        

  • sqlserver
  • 分页
  • 存储过程

相关文章

  • 如何在sql server中使用随机记录集

    这篇文章介绍了如何在sql server里使用随机记录集,需要的朋友可以参考下 2015-07-07

  • sql server 如何去掉内容里面的html标签

    这篇文章主要介绍了sql server 去掉内容里边的html标签的实现方法,代码超简单,具有一定的参考借鉴价值,需要的朋友可以参考下 2018-05-05

  • 如何监测和优化olap数据库

    微软sql server分析服务(ssas)提供了一个用来创建和管理数据挖掘应用和在线分析处理系统的强大引擎,你应该仔细的监测和优化olap数据库和潜在的关系数据源。 2015-09-09

  • sql server数据汇总五招轻松搞定

    有些时候你想让sql server 返回一个聚集结果集合,而不是一个详细的结果集。sql server的groupby子句,为你提供了一种聚合sql server数据的方式。groupby子句允许你在一列或多列数据甚至是表达式上进行分组操作,在这篇文章中,我将讨论如何使用groupby子句来汇总数据。 2015-09-09

  • sql server视图的讲解

    今天www.887551.com就为大家分享一篇关于sql server视图的讲解,www.887551.com觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随www.887551.com来看看吧 2019-01-01

  • sql server纵表与横表相互转换的方法

    这篇文章主要介绍了sql server纵表与横表相互转换的方法,本文通过图文并茂的形式给大家介绍,介绍的非常详细,具有参考借鉴价值,感兴趣的朋友一起看看吧 2016-09-09

  • 本篇文章www.887551.com将为大家介绍,基于存储过程的详细介绍,有需要的朋友可以参考一下 2013-04-04

  • sql server高可用的常见问题分析

    sql server高可用不就是微软的那几个技术吗,如replication, failover clustering,本文将详细介绍,有需求的朋友可以参考下 2012-11-11

  • case 子查询连接查询在sql开发中很常用的一个查询功能,感兴趣的你可不要错过本文,接下来为你详细介绍下 2013-02-02

  • sql server的优化建议与方法

    sql server的优化建议与方法… 2007-03-03

最新评论

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐