SQL 相关分页方法
【1】
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER PROCEDURE [dbo].[procCom_Get_Pagination]
(
	@Field_SQL			varchar(2000),			-- 返回的字段SQL
	@From_SQL			varchar(1000),			-- From中的SQL
	@Where_SQL			varchar(4000),			-- WhereSQL
	@Order_SQL			varchar(255),			-- 排序字段
	@Current_Page       int,					-- 当前显示的页码
	@Page_Size			int,					-- 每页条数 如果小于等于0 表示不分页
	@Total_Record		int output,				-- 总记录数
	@Total_Page			int output				-- 总页数
)AS
BEGIN
 DECLARE
	@v_SelectSQL	varchar(4000)
SET NOCOUNT ON;
BEGIN TRY
		IF LEN(ltrim(rtrim(@Where_SQL)))=0
			SET @Where_SQL='1=1';
IF @Current_Page<=0
			SET @Current_Page=1;
SET @v_SelectSQL='Select count(1) from '+@From_SQL+' Where '+@Where_SQL;
EXEC procCom_Calc_Total_Page @Count_SQL =@v_SelectSQL, 
										@Page_Size = @Page_Size,
										@Total_Record = @Total_Record OUTPUT,
										@Total_Page = @Total_Page OUTPUT
SELECT @v_SelectSQL=dbo.funcCom_Get_Pagination_SQL(@Field_SQL,@From_SQL,@Where_SQL,@Order_SQL,@Current_Page,@Page_Size,@Total_Page);
--测试的时候打印,正式环境注销打印
		--PRINT @v_SelectSQL;
		SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
EXEC(@v_SelectSQL);
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
END TRY
    BEGIN CATCH
		SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
--记录数据库的错误信息
		DECLARE @Note varchar(2000);
		SET @Note='procCom_Get_Pagination SQL='+@v_SelectSQL;
EXEC procCom_Log_DB_Msg_Error @Note =@Note;
RETURN ERROR_NUMBER();
    END CATCH
END
【2】
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER PROCEDURE [dbo].[procCom_Calc_Total_Page]
(
	@Count_SQL			varchar(4000),			-- Select count(1) from ** 的SQL
	@Page_Size			int,					-- 每页条数
	@Total_Record		int output,				-- 总记录数
	@Total_Page			int output				-- 总页数
)AS
BEGIN	
	SELECT @Total_Record=0,@Total_Page=0;
BEGIN TRY
		DECLARE @v_Num_Table table
		(
			Num int
		)
		SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
INSERT @v_Num_Table EXEC(@Count_SQL);
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT @Total_Record=Num FROM @v_Num_Table;
--分页显示  默认每一页显示20条 	
		IF (@Page_Size<=0 OR @Total_Record<=@Page_Size)
			SET @Total_Page=1
		ELSE
		BEGIN
			IF(@Total_Record%@Page_Size!=0)
				SET @Total_Page=@Total_Record/@Page_Size+1;
			ELSE
				SET @Total_Page=@Total_Record/@Page_Size;
		END
RETURN 0;
    END TRY
    BEGIN CATCH
		SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
--记录数据库的错误信息
		DECLARE @Note varchar(2000);
		SET @Note='procCom_Calc_Total_Page SQL='+@Count_SQL;
EXEC procCom_Log_DB_Msg_Error @Note =@Note;
RETURN ERROR_NUMBER();
    END CATCH
END
【3】
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER FUNCTION [dbo].[funcCom_Get_Pagination_SQL]
(	
	@Field_SQL			varchar(2000),			-- 返回的字段SQL
	@From_SQL			varchar(1000),			-- From中的SQL
	@Where_SQL			varchar(2000),			-- WhereSQL
	@Order_SQL			varchar(255),			-- 排序字段
	@Current_Page       int,					-- 当前显示的页码
	@Page_Size			int, 					-- 每页条数 如果小于等于0 表示不分页
	@Total_Page			int     				-- 总页数
)
RETURNS varchar(4000)
AS
BEGIN
 DECLARE
	@v_SelectSQL	varchar(4000)
IF @Current_Page<=0
		SELECT @Current_Page=1;
--不分页 或 页数=1
	IF(@Page_Size<=0 or @Total_Page<=1)
	BEGIN
		SELECT @v_SelectSQL='SELECT '+@Field_SQL+' FROM '+@From_SQL+' Where '+@Where_SQL +' order by '+@Order_SQL;
	END
	ELSE
	BEGIN
		SELECT @v_SelectSQL='SELECT '+@Field_SQL+' FROM (SELECT '+@Field_SQL+' ,Row_Number()  OVER(order by '+@Order_SQL+') as Inner_Row_ID '
							+' FROM '+@From_SQL+' Where '+@Where_SQL
							+' ) list WHERE Inner_Row_ID between '+CONVERT(varchar,@Page_Size)+'*'+CONVERT(varchar,@Current_Page)
							+'-'+CONVERT(varchar,@Page_Size)+'+1 AND '+CONVERT(varchar,@Page_Size)+'*'+CONVERT(varchar,@Current_Page);
	END
	RETURN(@v_SelectSQL);
END
【5】
EXEC procCom_Get_Pagination
					@Field_SQL = ' * ',
					@From_SQL = ' #Temp_Stat',
					@Where_SQL = '',
					@Order_SQL = @v_order_sql,
					@Current_Page = @Current_Page,
					@Page_Size = @Page_Size,
					@Total_Record = @Total_Record OUTPUT,
					@Total_Page = @Total_Page OUTPUT
SQL 相关分页方法的更多相关文章
- SQL Server游标    C# DataTable.Select() 筛选数据    什么是SQL游标?  SQL Server数据类型转换方法   LinQ是什么?  SQL Server 分页方法汇总
		SQL Server游标 转载自:http://www.cnblogs.com/knowledgesea/p/3699851.html. 什么是游标 结果集,结果集就是select查询之后返回的所 ... 
- SQL SERVER 分页方法
		最近项目中需要在SQL SERVER中进行分页,需要编写分页查询语句.之前也写过一些关于分页查询的语句,但是性能不敢恭维.于是在业务时间,在微软社区Bing了一篇老外写的关于SQL SERVER分页的 ... 
- SQL server 分页方法小结
		这里面介绍一下常用的分页方法: 1.使用top来分页 select top @pageSize * from table where id not in (select top @pageSize*( ... 
- SQL Server 分页方法汇总
		PageSize = 30 PageNumber = 201 方法一:(最常用的分页代码, top / not in) UserId UserId from UserInfo order by Use ... 
- thinkphp5 原生sql带分页方法
		1.先在顶部引入use think\paginator\driver\Page; 2.使用下例代码 $pageNumber = input('page')? input('page'):'0';//客 ... 
- Oracle、SQL Server、MySQL分页方法
		测试用例:查询TEST_TABLE表中TEST_COLUMN列的第10-20条数据 1,Oracle分页方法 SELECT A.* FROM ( SELECT ROWNUM ROWNO, B.* FR ... 
- 3种SQL语句分页写法
		在开发中经常会使用到数据分页查询,一般的分页可以直接用SQL语句分页,当然也可以把分页写在存储过程里,下面是三种比较常用的SQL语句分页方法,下面以每页5条数据,查询第3页为例子: 第一种:使用not ... 
- Sql Server 2012 的新分页方法分析(offset and fetch)  - 转载
		最近在分析 Sql Server 2012 中 offset and fetch 的新特性,发现 offset and fetch 无论语法的简洁还是功能的强大,都是相当相当不错的 其中 offset ... 
- Sql Server 2012 分页方法分析(offset and fetch)
		最近在分析 Sql Server 2012 中 offset and fetch 的新特性,发现 offset and fetch 无论语法的简洁还是功能的强大,都是相当相当不错的.其中 offse ... 
随机推荐
- Python Web学习笔记之为什么设计GIL
			GIL(global interpreter lock),全局解释器锁,是很多编程语言实现中都具有的特性,由于它的存在,解释器无法实现真正的并发.它也是 Python 中经常讨论的话题之一. Pyth ... 
- 20145221 《Java程序设计》课程总结
			20145221 <Java程序设计>课程总结 每周读书笔记链接汇总 Atom使用心得 - 21世纪的编辑器 网络安全攻防学习平台 - 基础关 Java实现:数据结构之排序 2014522 ... 
- 20162326 qilifeng 2018-2019-2 《网络对抗技术》Exp0 Kali安装 Week1
			<网络对抗技术>第1次作业 (一)作业任务 1.安装kali 2.设置共享文件夹 (二)操作过程 1.安装kali 因为之前安装过Oracle 的VM VirtualBox 所以直接 进入 ... 
- Rest和WebService的区别
			有好多人问我们在设计底层服务的时候到底是应该选择目前最流行的RestFul架构还是选择老牌的webService呢?今天我就将这两个概念做一下阐述,到底什么情况下选择什么比较合理. 首先需要了解:RE ... 
- 初探动态规划(DP)
			学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ... 
- 计算机基础教程11 - 互联网&内联网
			在本章中,我们将看到什么是Internet和Intranet,以及讨论两者之间的异同. 互联网 它是互联计算机网络的全球/全球系统.它使用标准的Internet协议(TCP / IP).Interne ... 
- UVa 11021 麻球繁衍
			https://vjudge.net/problem/UVA-11021 题意:有k只麻球,每只活一天就会死亡,临死之前可能会生出一些新的麻球.具体来说,生i个麻球的概率为Pi.给定m,求m天后所有麻 ... 
- Android -- 在一个Activity开启另一个Activity 并 获取他的返回值。
			1. 视图示例, 按选择弹出 2界面, 选择选项 回显到1 2. 示例代码 MainActivity.java, 第一个activity public class MainActivity e ... 
- 一定要用Windows自带的记事本编辑 applicationHost.config
			访问IIS时,发生了一个 HipIISEngineStub.dll不能读取的问题.(Windows Event可以确认). 很容易在网上找到了对策, http://chrisfleischhacker ... 
- Java网络编程和NIO详解6:Linux epoll实现原理详解
			Java网络编程和NIO详解6:Linux epoll实现原理详解 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NIO h ... 
