USE [DB_Common]

GO

/****** 对象:  StoredProcedure [dbo].[Com_Pagination]    脚本日期: 03/09/2012 23:46:20 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

/************************************************************

*

*Sql分页存储过程(支持多表分页存储)

*

*调用实例:

EXEC Com_Pagination 100, --总记录数

0, --总页数

--  'Person',--查询的表名

'

Person p

LEFT JOIN TE a

ON a.PID=p.Id

', --查询的表名(这里为多表)

'a.*', --查询数据列

'p.ID', --排列字段

'p.ID', --分组字段

2, --每页记录数

1, --当前页数

0, --是否使用分组,否是

' a.pid=2'--查询条件

************************************************************/

CREATE PROCEDURE [dbo].[Com_Pagination]

@TotalCount INT OUTPUT, --总记录数

@TotalPage INT OUTPUT, --总页数

@Table NVARCHAR(1000), --查询的表名(可多表,例如:Person p LEFT JOIN TE a ON a.PID=p.Id )

@Column NVARCHAR(1000), --查询的字段,可多列或者为*

@OrderColumn NVARCHAR(100), --排序字段

@GroupColumn NVARCHAR(150), --分组字段

@PageSize INT, --每页记录数

@CurrentPage INT, --当前页数

@Group TINYINT, --是否使用分组,否是

@Condition NVARCHAR(4000) --查询条件(注意:若这时候为多表查询,这里也可以跟条件,例如:a.pid=2)

AS

DECLARE @PageCount     INT, --总页数

@strSql        NVARCHAR(4000), --主查询语句

@strTemp       NVARCHAR(2000), --临时变量

@strCount      NVARCHAR(1000), --统计语句

@strOrderType  NVARCHAR(1000) --排序语句

BEGIN

SET @PageCount = @PageSize * (@CurrentPage -1)

SET @strOrderType = ' ORDER BY ' + @OrderColumn + ' '

IF @Condition != ''

BEGIN

IF @CurrentPage = 1

BEGIN

IF @GROUP = 1

BEGIN

SET @strCount = 'SELECT  @TotalCount=COUNT(*) FROM ' + @Table

+ ' WHERE ' + @Condition + ' GROUP BY ' + @GroupColumn

SET @strCount = @strCount + ' SET @TotalCount=@@ROWCOUNT'

SET @strSql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @Column

+ ' FROM ' + @Table + ' WHERE ' + @Condition +

' GROUP BY ' + @GroupColumn + ' ' + @strOrderType

END

ELSE

BEGIN

SET @strCount = 'SELECT  @TotalCount=COUNT(*) FROM ' + @Table

+ ' WHERE ' + @Condition

SET @strSql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @Column

+ ' FROM ' + @Table + ' WHERE ' + @Condition + ' ' + @strOrderType

END

END

ELSE

BEGIN

IF @GROUP = 1

BEGIN

SET @strCount = 'SELECT  @TotalCount=COUNT(*) FROM ' + @Table

+ ' WHERE ' + @Condition + ' GROUP BY ' + @GroupColumn

SET @strCount = @strCount + ' SET @TotalCount=@@ROWCOUNT'

SET @strSql = 'SELECT  * FROM (SELECT TOP (2000)  ' + @Column

+ ',ROW_NUMBER() OVER(' + @strOrderType +

') AS NUM FROM ' + @Table + ' WHERE ' + @Condition +

' GROUP BY ' + @GroupColumn +

') AS T WHERE NUM BETWEEN ' + STR(@PageCount + 1) +

' AND ' + STR(@PageCount + @PageSize)

END

ELSE

BEGIN

SET @strCount = 'SELECT  @TotalCount=COUNT(*) FROM ' + @Table

+ ' WHERE ' + @Condition

SET @strSql = 'SELECT  * FROM (SELECT TOP (2000)  ' + @Column

+ ',ROW_NUMBER() OVER(' + @strOrderType +

') AS NUM FROM ' + @Table + ' WHERE ' + @Condition +

') AS T WHERE NUM BETWEEN ' + STR(@PageCount + 1) +

' AND ' + STR(@PageCount + @PageSize)

END

END

END

ELSE

--没有查询条件

BEGIN

IF @CurrentPage = 1

BEGIN

IF @GROUP = 1

BEGIN

SET @strCount = 'SELECT  @TotalCount=COUNT(*) FROM ' + @Table

+ ' GROUP BY ' + @GroupColumn

SET @strCount = @strCount + 'SET @TotalCount=@@ROWCOUNT'

SET @strSql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @Column

+ ' FROM ' + @Table + ' GROUP BY ' + @GroupColumn + ' ' +

@strOrderType

END

ELSE

BEGIN

SET @strCount = 'SELECT  @TotalCount=COUNT(*) FROM ' + @Table

SET @strSql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @Column

+ ' FROM ' + @Table + ' ' + @strOrderType

END

END

ELSE

BEGIN

IF @GROUP = 1

BEGIN

SET @strCount = 'SELECT  @TotalCount=COUNT(*) FROM ' + @Table

+ ' GROUP BY ' + @GroupColumn

SET @strCount = @strCount + 'SET @TotalCount=@@ROWCOUNT'

SET @strSql = 'SELECT  * FROM (SELECT TOP (2000)  ' + @Column

+ ',ROW_NUMBER() OVER(' + @strOrderType +

') AS NUM FROM ' + @Table + ' GROUP BY ' + @GroupColumn +

') AS T WHERE NUM BETWEEN ' + STR(@PageCount + 1) +

' AND ' + STR(@PageCount + @PageSize)

END

ELSE

BEGIN

SET @strCount = 'SELECT  @TotalCount=COUNT(*) FROM ' + @Table

SET @strSql = 'SELECT  * FROM (SELECT TOP (2000)  ' + @Column

+ ',ROW_NUMBER() OVER(' + @strOrderType +

') AS NUM FROM ' + @Table + ') AS T WHERE NUM BETWEEN ' +

STR(@PageCount + 1) + ' AND ' + STR(@PageCount + @PageSize)

END

END

END

EXEC sp_executesql @strCount,

N'@TotalCount INT OUTPUT',

@TotalCount OUTPUT

IF @TotalCount > 2000

BEGIN

SET @TotalCount = 2000

END

IF @TotalCount%@PageSize = 0

BEGIN

SET @TotalPage = @TotalCount / @PageSize

END

ELSE

BEGIN

SET @TotalPage = @TotalCount / @PageSize + 1

END

SET NOCOUNT ON

EXEC (@strSql)

END

SET NOCOUNT OFF

/**调用实例:

EXEC Com_Pagination 100, --总记录数

0, --总页数

--  'Person',--查询的表名

'

Person p

LEFT JOIN TE a

ON a.PID=p.Id

', --查询的表名(这里为多表)

'a.*', --查询数据列

'p.ID', --排列字段

'p.ID', --分组字段

2, --每页记录数

1, --当前页数

0, --是否使用分组,否是

' a.pid=2'--查询条件

SELECT a.*

FROM   Person p

LEFT JOIN TE a

ON  a.PID = p.Id

WHERE  a.pid = 2

**/

Sql分页存储过程(支持多表分页存储)相关推荐

  1. ORACLE动态sql在存储过程中出现表或视图不存在的解决方法

    ORACLE动态sql在存储过程中出现表或视图不存在的解决方法 CREATE OR REPLACE PROCEDURE P_test is strsql varchar2(2000); BEGIN   ...

  2. mysql 存储过程复杂查询_SQL分页存储过程 支持连接查询等复杂的SQL

    CREATE PROCEDURE Pagination ( @SQL nvarchar(1024), @PageSize int = 20, --分页大小 @PageIndex int = 0, -- ...

  3. ASP.NET调用Oracle分页存储过程并结合ASPnetpager分页控件 实现分页功能

    之前用的是GridView自带的分页功能,那速度啊慢的真实不行  ,决定自定义分页  Oracle库里有5W多条数据 AspnetPager做的还是不错,拿过来用 Oracle 分页存储过程: cre ...

  4. 完整SQL分页存储过程(支持多表联接)

    Code /*********************************************************   * 作    用:数据分页(完整SQL分页存储过程(支持多表联接)) ...

  5. [转]Sql Server 分页存储过程

    本文转自: 版权声明:作者:jiankunking 出处:http://blog.csdn.net/jiankunking  本文版权归作者和CSDN共有,欢迎转载,但未经作者同意必须保留此段声明,且 ...

  6. 支持DISTINCT的通用分页存储过程(SQL2005)

    /****** 对象: StoredProcedure [dbo].[P_CommonPagination] 脚本日期: 07/22/2009 10:22:01 ******/ SET ANSI_NU ...

  7. 总结的几个 sql 分页存储过程

    06 CREATE PROCEDURE [dbo].[sp_All_Pager] 07     @tblName nvarchar(255),--表名 08     @fldNames nvarcha ...

  8. 李洪根关于[SQL]对于分页存储过程

    作者:李洪根  微软MVP 1.我个人认为最好的分页方法是: Select top 10 * from table where id>200 写成存储过程,上面的语句要拼一下sql语句,要获得最 ...

  9. SQL Server分页存储过程实践(图解)

    下面来对SQL Server分页存储过程进行一下实做.图解成功的各个步骤. 一 找到大数据量的示例表 分页都是针对大记录数的表:反之有大记录数的表,可能就需要分页.例如银行用户表,就会上千万.下面先做 ...

  10. SQL SERVER 通用分页存储过程

    SQL SERVER 通用分页存储过程 从SQLSERVER 2005开始,提供了Row_Number()函数,利用函数生成的Index来处理分页,按照正常的逻辑思维都是传pageIndex和page ...

最新文章

  1. 限制会话id服务端不共享_会话控制 - able-woman - 博客园
  2. 页面生成周期中的两个Application池的详情小弟了解
  3. mysql表名查询sql
  4. 基于HTML5的WebGL呈现A星算法的3D可视化
  5. 依图笔试2020/8/28,我是机器人(AC)、多彩珠子最长子串长度(AC)
  6. 如何用python画组合图形_python结合G2绘制精美图形
  7. jenkins自动化构建iOS应用配置过程中遇到的问题
  8. 安全云盘项目(一):1.5 bufferevent服务端代码事件策略
  9. nginx的基本使用和反向代理,地址重写问题
  10. PCL中的采集器之一OpenNI
  11. oracle 索引 效果,Oracle中不使用索引和使用索引的效果比较分析
  12. linux根目录cdef,关于linux:Cython:从python调用的cdef函数中调用扩展类型cdef方法...
  13. 爬虫练习生|爬虫前奏(爬虫介绍、工具的安装、爬虫分类、爬虫须知)
  14. python自动轨迹绘制七边形_斜抛运动的数学模型
  15. 数据可视化怎么操作?看完这篇你就明白了
  16. 计算机 64虚拟内存设置方法,64位的WIN7,4G内存,虚拟内存怎么设置
  17. 拳皇觉醒服务器维护,拳皇全明星拳魂觉醒手游9月26日更新公告_拳皇全明星拳魂觉醒9月26日更新了什么_玩游戏网...
  18. 微信计算机控制技术试卷,微型计算机控制技术试卷答案A.doc
  19. 企业微信服务商集成解决方案
  20. 计算机与信息安全的基本知识,信息安全的基本常识

热门文章

  1. [Flex]浅析Mate flex framework在实际项目中的应用(二)
  2. 考研英语作文:环保呼吁信
  3. springmvc源码解析MvcNamespaceHandler之mvc:default-servlet-handler/
  4. Linux 文本处理工具
  5. Scala 深入浅出实战经典 第91讲:Akka第一个案例动手实战架构设计
  6. FLUSH TABLE WITH READ LOCK详解
  7. JS开发之Factory(工厂)模式解析
  8. 30. 实体和编码(2)
  9. 10. Document getElementsByTagName() 方法
  10. Java类与类,类与接口,接口与接口关系