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 ...
随机推荐
- Symmetric Tree,对称树
问题描述: Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). ...
- vim 将文件从dos格式转换到unix格式
dos格式文件传输到unix系统时,会在每行的结尾多一个^M(/r),当然也有可能看不到.但是在vim的时候,会在下面显示此文件的格式,比如 "dos.txt" [dos] 120 ...
- [原][osgearth]FAQ
参考:http://docs.osgearth.org/en/latest/faq.html Common Usage How do I place a 3D model on the map? Th ...
- auth权限认证详细讲解
auth权限认证详细讲解 一.总结 一句话总结:四表两组关系,一个多对多(权限和用户组之间)(多对多需要3个表),一个一对多(用户和用户组之间) 1.实际上使用Auth是需要4张表的(1.会员表 2. ...
- PHP如何安装扩展
PHP如何安装扩展 一.总结 一句话总结:兩步: dll php.ini a.下载好扩展的dll,放入指定文件夹下 b.在php.ini配置文件中声明插件 1.什么是php扩展? php核心 不支持 ...
- bzoj2120: 数颜色 带修莫队
墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P ...
- 个人知识管理系统Version1.0开发记录(07)
模 块 复 用 原本还要测试一会的,突然出现一连串诡异的问题,比如,编译少加载个类啊,输入地址少个字母啊,改几行代码一改就是半小时啊.这是在提醒我们大脑疲倦了,所以果断小结,下次继续.这一次简单完成了 ...
- 安装Ubuntu版本linux过程中没有提示设置root用户密码问题的解决办法
原来ubunto不提倡设置root用户,系统安装成功后,root密码是随机的,那么在这种情况下如何得到root权限呐,具体方法如下: 终端中输入:sudo passwd root 此时重新设置原登录用 ...
- ossim中Spot5模型bug修复
ossim中Spot5模型在读取像素视线角时存在一个严重的bug,导致某些点的视线角提取错误. 下面是ossim中getPixelLookAngleX 函数的代码: ossimSpotDimapSup ...
- URAL 1040 Airline Company 构造,思路 难度:2
http://acm.timus.ru/problem.aspx?space=1&num=1040 题目要求在一个联通无向图中找出一种方法给边标号使得任意一个有多条边的点,边的号码的最大公约数 ...