MSSQL分页存储过程完整示例(支持多表分页存储)

本文实例讲述了MSSQL分页存储过程。分享给大家供大家参考,具体如下:

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 Server数据库程序设计有所帮助。

时间: 2024-10-02 14:57:16

MSSQL分页存储过程完整示例(支持多表分页存储)的相关文章

MSSQL分页存储过程完整示例(支持多表分页存储)_MsSql

本文实例讲述了MSSQL分页存储过程.分享给大家供大家参考,具体如下: USE [DB_Common] GO /****** 对象: StoredProcedure [dbo].[Com_Pagination] 脚本日期: 03/09/2012 23:46:20 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO /************************************************************

Java/JSP中调用SQL Server存储过程完整示例

[引自孟子E章的博客]最近做了个Java的小项目(第一次写Java的项目),到网上搜索了半天,找 到了一个比较好点的调用存储过程的例子,而且网上普遍采用的都是setXXX((int parameterIndex, XXX x)的形式.这种形式感觉不是很直观,下面就发布一个完整的采用setXXX(String parameterName, XXX x)的编写方法.创建数据表,存储过程的代码都完整发布. 创建表 CREATE TABLE [BookUser] ( [UserID] [int] IDE

支持多表分页查询的存储过程

本文转载:http://hi.baidu.com/hanrenjun/item/caa393dc811efbdd251f40ad               http://www.bhcode.net/article/20081229/3796.html 同样不错的博客:http://blog.csdn.net/lyq5655779/article/details/7328560#   usp_PagingLarge测试脚本: USE [Northwind] GO --SQL语句 SELECT

SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程(支持单表或多表结查集分页)

原文:SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程(支持单表或多表结查集分页) SQL Server利用RowNumber()内置函数与Over关键字实现通用分页存储过程,支持单表或多表结查集分页,存储过程如下: /******************/ --Author:梦在旅途(www.Zuowenjun.cn) --CreateDate:2015-06-02 --Function:分页获取数据 /******************/ crea

折腾Oracle问题小菜记[分页存储过程/查询所有表、视图、存储过程/查询表、视图、存储过程字段结构与参数](三)

说明: 为了让CYQ.Data 框架支持Oracle,这几天对Oracle进行了基本探索,并把中间遇到的问题轻轻的记录了下来,与大伙共享.     总共有三篇: 1:初折腾Oracle问题小记 2:初折腾Oracle问题小记二 3:就是本篇了:折腾Oracle问题小菜记(三)   本篇又有新突破,再记录一下:   1:自己写了一条分页存储过程,也是CYQ.Data默认产生的存储过程:   create or replace package MyPackage as  type MyCursor 

二种MSSQL分页存储过程实例应用

二种MSSQL分页存储过程实例应用 <html xmlns="http://www.111cn.net/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>二种MSSQL分页存储过程实例应用</title> </head> <b

GridView用存储过程自定义分页分页的完整例子

问题描述 谁有GridView用存储过程自定义分页分页的完整例子(C#)给一个 解决方案 解决方案二:datalist,repeater存储过程分页带1,2,3,4,5,6,7导航的记住把分都给我哦存储过程:直接复制进去CREATEprocup_GetTopicList@a_TableListVarchar(200),@a_TableNameVarchar(30),@a_SelectWhereVarchar(500),@a_SelectOrderIdVarchar(20),@a_SelectOr

支持任意排序的分页存储过程(asp.net/sqlserver)

 代码如下 复制代码 ------------------------------------  --用途:支持任意排序的分页存储过程  --说明:  ------------------------------------    CREATE PROCEDURE [dbo].[UP_GetRecordByPageOrder]    @tblName varchar(255),   -- 表名  @fldName varchar(255),   -- 显示字段名  @OrderfldName v

mssql 通用分页存储过程实例

 代码如下 复制代码 /*通用分页存储过程*/ USE HotelManagementSystem GO IF EXISTS(SELECT * FROM sys.objects WHERE NAME='cndoup_GetPageOfRecords') DROP PROCEDURE cndoup_GetPageOfRecords GO --创建存储过程 CREATE PROCEDURE cndoup_GetPageOfRecords @pageSize int = 20,