Sql分页存储过程(支持多表分页存储)
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分页存储过程(支持多表分页存储)相关推荐
- ORACLE动态sql在存储过程中出现表或视图不存在的解决方法
ORACLE动态sql在存储过程中出现表或视图不存在的解决方法 CREATE OR REPLACE PROCEDURE P_test is strsql varchar2(2000); BEGIN ...
- mysql 存储过程复杂查询_SQL分页存储过程 支持连接查询等复杂的SQL
CREATE PROCEDURE Pagination ( @SQL nvarchar(1024), @PageSize int = 20, --分页大小 @PageIndex int = 0, -- ...
- ASP.NET调用Oracle分页存储过程并结合ASPnetpager分页控件 实现分页功能
之前用的是GridView自带的分页功能,那速度啊慢的真实不行 ,决定自定义分页 Oracle库里有5W多条数据 AspnetPager做的还是不错,拿过来用 Oracle 分页存储过程: cre ...
- 完整SQL分页存储过程(支持多表联接)
Code /********************************************************* * 作 用:数据分页(完整SQL分页存储过程(支持多表联接)) ...
- [转]Sql Server 分页存储过程
本文转自: 版权声明:作者:jiankunking 出处:http://blog.csdn.net/jiankunking 本文版权归作者和CSDN共有,欢迎转载,但未经作者同意必须保留此段声明,且 ...
- 支持DISTINCT的通用分页存储过程(SQL2005)
/****** 对象: StoredProcedure [dbo].[P_CommonPagination] 脚本日期: 07/22/2009 10:22:01 ******/ SET ANSI_NU ...
- 总结的几个 sql 分页存储过程
06 CREATE PROCEDURE [dbo].[sp_All_Pager] 07 @tblName nvarchar(255),--表名 08 @fldNames nvarcha ...
- 李洪根关于[SQL]对于分页存储过程
作者:李洪根 微软MVP 1.我个人认为最好的分页方法是: Select top 10 * from table where id>200 写成存储过程,上面的语句要拼一下sql语句,要获得最 ...
- SQL Server分页存储过程实践(图解)
下面来对SQL Server分页存储过程进行一下实做.图解成功的各个步骤. 一 找到大数据量的示例表 分页都是针对大记录数的表:反之有大记录数的表,可能就需要分页.例如银行用户表,就会上千万.下面先做 ...
- SQL SERVER 通用分页存储过程
SQL SERVER 通用分页存储过程 从SQLSERVER 2005开始,提供了Row_Number()函数,利用函数生成的Index来处理分页,按照正常的逻辑思维都是传pageIndex和page ...
最新文章
- 限制会话id服务端不共享_会话控制 - able-woman - 博客园
- 页面生成周期中的两个Application池的详情小弟了解
- mysql表名查询sql
- 基于HTML5的WebGL呈现A星算法的3D可视化
- 依图笔试2020/8/28,我是机器人(AC)、多彩珠子最长子串长度(AC)
- 如何用python画组合图形_python结合G2绘制精美图形
- jenkins自动化构建iOS应用配置过程中遇到的问题
- 安全云盘项目(一):1.5 bufferevent服务端代码事件策略
- nginx的基本使用和反向代理,地址重写问题
- PCL中的采集器之一OpenNI
- oracle 索引 效果,Oracle中不使用索引和使用索引的效果比较分析
- linux根目录cdef,关于linux:Cython:从python调用的cdef函数中调用扩展类型cdef方法...
- 爬虫练习生|爬虫前奏(爬虫介绍、工具的安装、爬虫分类、爬虫须知)
- python自动轨迹绘制七边形_斜抛运动的数学模型
- 数据可视化怎么操作?看完这篇你就明白了
- 计算机 64虚拟内存设置方法,64位的WIN7,4G内存,虚拟内存怎么设置
- 拳皇觉醒服务器维护,拳皇全明星拳魂觉醒手游9月26日更新公告_拳皇全明星拳魂觉醒9月26日更新了什么_玩游戏网...
- 微信计算机控制技术试卷,微型计算机控制技术试卷答案A.doc
- 企业微信服务商集成解决方案
- 计算机与信息安全的基本知识,信息安全的基本常识
热门文章
- [Flex]浅析Mate flex framework在实际项目中的应用(二)
- 考研英语作文:环保呼吁信
- springmvc源码解析MvcNamespaceHandler之mvc:default-servlet-handler/
- Linux 文本处理工具
- Scala 深入浅出实战经典 第91讲:Akka第一个案例动手实战架构设计
- FLUSH TABLE WITH READ LOCK详解
- JS开发之Factory(工厂)模式解析
- 30. 实体和编码(2)
- 10. Document getElementsByTagName() 方法
- Java类与类,类与接口,接口与接口关系