分页存储过程--From:桌面备份 -> sql2005新功能.docx
二、以下示例将返回行号为 50 到 60(含)的行,并以 OrderDate 排序。
USE AdventureWorks;
GO
WITH OrderedOrders AS
(SELECT SalesOrderID, OrderDate,
ROW_NUMBER() OVER (order by OrderDate)as RowNumber
FROM Sales.SalesOrderHeader )
SELECT *
FROM OrderedOrders
WHERE RowNumber between 50 and 60;
三、实现分页存储过程(固定到某个表的数据)
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: cxw
-- Create date: 2006/11/14
-- Description: 利用Row_Number函数实现分页存储过程
-- exec DividePageForROW_NUMBER 2,1,'',''
-- =============================================
Create PROCEDURE DividePageForROW_NUMBER
@iPageSize int --每页数
,@iIndexPage int --第几页
,@vOrderBy varchar(50) --排序字段
,@iRowCount int --总记录数
AS
BEGIN
SET NOCOUNT ON;
with PageTable as
(
select row_number() over(order by ReasonID) TID,* from A
)
select *
from PageTable
where TID between ((@iIndexPage-1)*@iPageSize+1) and @iPageSize*@iIndexPage
SET NOCOUNT OFF;
END
GO
use study;
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
-- =============================================
-- Author: cxw
-- Create date: 2006/11/14
-- Description: 利用Row_Number函数实现分页存储过程(输出总记录数用返回一个字段)
--select * from OrderDetail
/*
--table表的分页
exec [PublicPageQuery] @vQueryString='OrderDetail'
,@vKeyID='OrderNo'
,@vQueryType='table'
--为空就取表里所有字段,否则取自已设定字段, 最好不要取所有,指定
,@vColunmString='OrderNo,ProdNo,ProdName'
,@vIsHaveRowCount='no'
,@iPageSize=5
,@iIndexPage=2
--查询字符串的分页(单一的查询条件)
exec [PublicPageQuery] @vQueryString='select OrderNo,ProdNo,ProdName
from OrderDetail
where OrderNo like ''%So%''
and ProdNo like ''%%'''
,@vKeyID='OrderNo'
,@vQueryType='select'
,@vColunmString='OrderNo,ProdNo,ProdName'
,@vIsHaveRowCount='no'
,@iPageSize=5
,@iIndexPage=2
--带有关联的查询字符串
exec [PublicPageQuery] @vQueryString='SELECT *
FROM(
SELECT * FROM (
SELECT
RequestNo,RequestTypeID,RequestType,RequestUser,NeedToAddress,NeedArriveTime,Memo,Status
FROM ERPDATA.dbo.TP_RequestOfficeCar
UNION
SELECT
A.RequestNo,A.RequestTypeID,RequestType,RequestUser,B.CustomerAddress as
NeedToAddress,B.NeedArriveTime,A.Memo,A.Status
FROM ERPDATA.dbo.TP_RequestDeliverGoodsCar
A,ERPDATA.dbo.TP_RequestDeliverGoodsCarDetail B
WHERE A.RequestNo=B.RequestNo
) M
WHERE isnull(RequestUser,'') LIKE ''%%''
AND isnull(NeedToAddress,'') LIKE ''%%''
AND isnull(Status,'') like ''%%''
AND isnull(Memo,'') LIKE ''%%'' ) Main '
,@vKeyID='OM.OrderNo'
,@vQueryType='select'
,@vColunmString='OrderNo,BillTo,BillToName'
,@vIsHaveRowCount='no'
,@iPageSize=5
,@iIndexPage=1
*/
-- =============================================
Create PROCEDURE [dbo].[PublicPageQuery]
@vQueryString nvarchar(MAX) --查询字符串,或表名
,@vKeyID varchar(200) --关键字(排序字段,索引字段,最好用索引字段,大大提高分页查询速度)
,@vQueryType varchar(20) --查询类型,为表(table),查询语句(select)
,@vColunmString nvarchar(2000) --所显示字段值(最好都添上此字段名)
,@vIsHaveRowCount varchar(5) --是否显示总记录数,有(yes),不(no)
,@iPageSize int --每页数
,@iIndexPage int --第几页
AS
BEGIN
SET NOCOUNT ON;
declare @vSQLString varchar(8000) --查询SQL字符串
,@vRowCountString varchar(50) --自动增量统计查询字符串
,@vRowNumberString varchar(200) --自动增量查询字符串
,@vWhereKeyStr varchar(10) --条件关键字
,@iStart int --开始位置
,@iEnd int --结束位置
--将SQL语句优化,去掉没有必要的查询条件
--select * from dbo.RecurrentSplit(@vQueryString,'and ',1,1)
--where isnull(SplitName,'')<>''
--return
set @vWhereKeyStr='%%' --所要去掉的关键查询条件
if(charindex(@vWhereKeyStr,@vQueryString)=0)
begin
goto lbl_Query
end
set @vQueryString=replace(@vQueryString,'
',' ') --去掉回车符
select @vQueryString=case when A.IndexNo>0 --最少保留第一条查询条件,第一个条件最好最经常查询字段条件
then
case when charindex(@vWhereKeyStr,B.SplitName)>0
then
--只替换所需要修改的无条件的字符串。
replace(@vQueryString
,substring(B.SplitName,0,charindex(@vWhereKeyStr,B.SplitName)+len(@vWhereKeyStr)+2),'')
else @vQueryString
end
else
@vQueryString
end
--select @vQueryString=
-- case when charindex('%%',B.SplitName)>0
-- then replace(@vQueryString,B.SplitName,'')
-- else @vQueryString
-- end
from
(
select * from dbo.RecurrentSplit(@vQueryString,'and ',1,1)--字符串分割函数,之前有
where isnull(SplitName,'')<>''
) A
cross apply dbo.RecurrentSplit(A.SplitName,'or ',1,1) B
--set @vQueryString=case when
charindex('''',@vQueryString,charindex('where',@vQueryString))>0
--then @vQueryString else
left(@vQueryString,charindex('where',@vQueryString)-1) end
--select @vQueryString
--return
--查询断点
lbl_Query:
select @vSQLString=''
,@vRowNumberString='PageIndex=row_number() over(order by '+@vKeyID+')'
,@vQueryString=ltrim(rtrim(@vQueryString))
,@vColunmString=case when @vQueryType='table'
then
case when @vColunmString=''
then '*'
else @vColunmString
end
else --取出所要取出的字段
case when @vColunmString=''
then
substring(@vQueryString,len('select')+1,charindex('from',@vQueryString)-len('select')-1)
else @vColunmString end
end
,@vQueryString=case @vQueryType when 'table'
then 'select '+@vRowNumberString+char(13)
+','+@vColunmString+' from '+@vQueryString
when 'select'
then 'select '+@vRowNumberString+char(13)
+','+right(@vQueryString,len(@vQueryString)-len('select'))--'('+@vQueryString+')Alias'
else 'procedure'
end
,@vRowCountString=case when @vIsHaveRowCount='yes'
then ',(select count(0) from PageTable) ''RowCount'''
else '' end
,@iStart=(@iIndexPage-1)*@iPageSize+1
,@iEnd=@iPageSize*@iIndexPage
set
@vSQLString='with PageTable as
(
'+@vQueryString+'
)
select '
+@vColunmString+char(13)
+case when @vRowCountString='' then '' else @vRowCountString+char(13) end
+'from PageTable
where PageIndex between '+cast(@iStart as varchar)+' and '+cast(@iEnd as
varchar)
print @vSQLString
exec(@vSQLString)
SET NOCOUNT OFF;
END
分页存储过程--From:桌面备份 -> sql2005新功能.docx的更多相关文章
- 支持DISTINCT的通用分页存储过程(SQL2005)
/****** 对象: StoredProcedure [dbo].[P_CommonPagination] 脚本日期: 07/22/2009 10:22:01 ******/ SET ANSI_NU ...
- SQLSERVER2012的分页新功能
SQLSERVER2012的分页新功能 简介 SQL Server 2012中在Order By子句之后新增了OFFSET和FETCH子句来限制输出的行数从而达到了分页效果.相比较SQL Server ...
- 高效sql2005分页存储过程
高效分页存储过程 --分页存储过程示例 Alter PROCEDURE [dbo].[JH_PageDemo] @pageSize int = 9000000000, @pageIndex int = ...
- SQL2005分页存储过程(支持多表联接)
Code /********************************************************* * 作 用:数据分页(完整SQL分页存储过程(支持多表联接)) ...
- CentOS以及Oracle数据库发展历史及各版本新功能介绍, 便于构造环境时有个对应关系
CentOS版本历史 版本 CentOS版本号有两个部分,一个主要版本和一个次要版本,主要和次要版本号分别对应于RHEL的主要版本与更新包,CentOS采取从RHEL的源代码包来构建.例如CentOS ...
- Red Hat Enterprise Linux 7的新功能
简介红帽最新版本的旗舰平台交付显著增强的可用性. 性能和可靠性. 丰富的新功能为架构. 系统管理员和开发人员提供所需的资源以更高效地进行创新和管理.架构师: 红帽® 企业 Linux® 7 适合 ...
- sqlserver2016新功能
SQL Server 2016中的新功能(数据库引擎) 2017年1月13日 23分钟阅读时长 作者 本人建了个领优惠卷购物群,平时网购可以省点钱.有需要的加群:511169656交流,谢谢 本主题 ...
- OpenStack Q版本新功能以及各核心组件功能对比
OpenStack Q版本已经发布了一段时间了.今天, 小编来总结一下OpenStack Q版本核心组件的各项主要新功能, 再来汇总一下最近2年来OpenStack N.O.P.Q各版本核心组件的主要 ...
- RAD Studio 10.3.2七大新功能介绍
RAD Studio 10.3.2七大新功能 Delphi支持macOS 64位应用的开发. C++Builder中Windows 64位平台支持C ++ 17特性. C ++ LSP 代码洞察改进. ...
随机推荐
- 【官方文档】《暗黑世界V1.4》API说明!
指令号说明 账号注册 100 { username str 用户名 password str 密码 } 返回信息 { result bool 指令调用是否成功 ...
- tortoisesvn的安装与使用
1.下载安装文件,我用的是1.6.同时可以下载一个中文的安装包. 2.我在F盘建立了一个文件夹tortoisesvn,专门用来放置版本目录文件.然后右键这个文件夹,选择tortoisesvn-> ...
- TCP 协议如何保证可靠传输
一.综述 1.确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传. 2.数据校验 3.数据合理分片和排序: UDP:IP数据报大于1500字节,大于MTU.这个时候发送方IP层 ...
- 绕过kernel模块版本校验检测
kernel module version check bypass . 举例说明 . 内核是怎么实现的 . 怎样去突破 . 总结 . 举例说明 Linux内核版本很多,升级很快,2个小内核版本中内核 ...
- hdu4671Backup Plan
http://acm.hdu.edu.cn/showproblem.php?pid=4671 这个高端的题意啊 看了N久啊 n>m时 直接第一列按顺序来 第二列为M+1 else 第一列顺序 ...
- hadoop 序列化源码浅析
1.Writable接口 Hadoop 并没有使用 JAVA 的序列化,而是引入了自己实的序列化系统, package org.apache.hadoop.io 这个包中定义了大量的可 ...
- E212: 不能以写入模式打开 linux
跟大家讲解下事情发生的情况 背景:linux下有多个用户 每个用户有自己的密码 还有root用户 事由:我用zhengdengping用户登录 想去拷贝点 用户 lixianchu ...
- tyvj 1729 文艺平衡树
文艺平衡树 From admin 背景 Background 此为平衡树系列第二道:文艺平衡树 描述 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以 ...
- mysql shell 备份脚本
使用 mysqldump 备份数据库,通过 FTP 上传到备份服务器,同时在本地保留备份文件. 新建一个 Shell 脚本文件 vi /home/work/backup.sh 添加如下内容: #! / ...
- SharePoint 2010 master page 控件介绍(2):ribbon (一同事读听着像泪奔)
转:http://blog.csdn.net/lgm97/article/details/6409208 <!-- ===== 开始Ribbon ======================= ...