问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

浅谈SQL Server2005的几种分页方法

发布网友 发布时间:2022-05-01 00:16

我来回答

2个回答

懂视网 时间:2022-05-01 04:37

USE AdventureWorks2012; 2 GO 3 4 DECLARE @PageSize int = 100, @PageNumber int = 3; 5 6 WITH Product_CTE 7 AS 8 ( 9 SELECT Name 10 ,ProductNumber 11 ,StandardCost 12 ,ListPrice 13 ,SellStartDate 14 ,ROW_NUMBER() OVER(ORDER BY ProductID) AS RowNumber 15 ,COUNT(*) OVER() AS TotalCount 16 FROM Production.Product 17 ) 18 SELECT * 19 FROM Product_CTE 20 WHERE RowNumber BETWEEN @PageSize * (@PageNumber - 1) + 1 AND @PageSize * @PageNumber;

 

我最喜欢的SQL分页查询方法

标签:

热心网友 时间:2022-05-01 01:45

SQL Server分页查询是我们经常会用到的功能,其实现方法也有很多,本文的几种分页方法摘自《SQL Server2005性能调优》一书。希望对您学习SQL Server分页查询方面能有所帮助。
用以下脚本生成测试数据:
CREATE TABLE TRANS_TABLE(
MYID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
MYDESC VARCHAR(10),
MYDATE DATETIME,
MYGROUPID INT)
DECLARE @I INT
SET @I = 0WHILE @I < 1000000
BEGIN
INSERT INTO TRANS_TABLE
SELECT CHAR(ASCII('A') - 2 + (2 * (1 + ABS(CHECKSUM(NEWID())) % 26))),
DATEADD(day, ABS(CHECKSUM(NEWID())) % 365, '01/01/2007'),
(ABS(CHECKSUM(NEWID())) % 10)
SET @I = @I + 1
END
CREATE NONCLUSTERED INDEX IX_TRANS_TABLE_MYDATE
ON TRANS_TABLE(MYDATE)
CREATE NONCLUSTERED INDEX IX_TRANS_TABLE_MYGROUPID
ON TRANS_TABLE(MYGROUPID)

1、基于CTE分页
1)用row_number()排名函数,派生表的方式分页
DECLARE @START_ID int, @START_ROW int, @MAX_ROWS int
SELECT @START_ROW = 1, @MAX_ROWS = 25
select *
from ( select p.*, rownum rnum
FROM (
SELECT ROW_NUMBER() OVER(ORDER BY MyDate, MYID) AS rowNum, *
FROM TRANS_TABLE (NOLOCK)
) p
where rownum <= @START_ROW + @MAX_ROWS - 1
)
z where rnum >= @START_ROW

2)用CTE方式取代派生表
DECLARE @START_ROW int, @MAX_ROWS int, @TOT_ROW_CNT int
SELECT @START_ROW = 1, @MAX_ROWS = 25;
WITH PAGED AS (
SELECT ROW_NUMBER() OVER(ORDER BY MyDate, MYID) AS rowNum, *
FROM TRANS_TABLE (NOLOCK)
)
SELECT *
FROM PAGEDWHERE ROWNUM BETWEEN @START_ROW AND @START_ROW + @MAX_ROWS-1
3)也是CTE方法,但是根据测试数据显示这种性能比前两种都好
DECLARE @START_ROW int, @MAX_ROWS int, @TOT_ROW_CNT int
SELECT @START_ROW = 1, @MAX_ROWS = 25;
WITH PAGED AS (
SELECT ROW_NUMBER() OVER(ORDER BY MyDate, MYID) AS rowNum, MYID
FROM TRANS_TABLE (NOLOCK)
)
SELECT TT.*
FROM PAGED PGD
INNER JOIN TRANS_TABLE TT
ON PGD.MYID = TT.MYID
WHERE ROWNUM BETWEEN @START_ROW AND @START_ROW + @MAX_ROWS - 1
ORDER BY MyDate, MYID
2、 基于ROW_COUNT的分页
DECLARE @START_ID int, @START_ROW int, @MAX_ROWS int,
@START_DATETIME DATETIME, @TOT_ROW_CNT INT
SELECT @START_ROW = 1, @MAX_ROWS = 25
-- Get the first row for the page
SET ROWCOUNT @START_ROW
SELECT @START_ID = MYID, @START_DATETIME = MYDATE FROM TRANS_TABLE (NOLOCK)
ORDER BY MYDATE, MYID
-- Now, set the row count to MaximumRows and get
-- all records >= @first_idSET ROWCOUNT @MAX_ROWS
SELECT *
FROM TRANS_TABLE (NOLOCK)
WHERE MYID >= @START_ROW
AND MYDATE >= @START_DATETIME
ORDER BY MYDATE, MYID
SET ROWCOUNT 0
3、 TOP @X分页
SQL Server 2005中可以把返回行数做为参数传给top语句。
DECLARE @START_ID int, @START_ROW int, @MAX_ROWS int, @TOT_ROW_CNT INT, @START_DESC VARCHAR(10)
SELECT @START_ROW = 1, @MAX_ROWS = 25
-- Get the first row for the page
SELECT TOP(@START_ROW) @START_ID = MYID, @START_DESC = MYDESC FROM TRANS_TABLE (NOLOCK)
ORDER BY MYDESC, MYID
SELECT TOP(@MAX_ROWS) *
FROM TRANS_TABLE (NOLOCK)
WHERE MYID >= @START_ROW
AND MYDESC >= @START_DESC
ORDER BY MYDESC, MYID

4、 Temp表分页
DECLARE @START_ROW int, @MAX_ROWS int, @TOT_ROW_CNT int
SELECT @START_ROW = 1, @MAX_ROWS = 25;
SELECT ROW_NUMBER() OVER(ORDER BY MyDate, MYID) AS rowNum,
MYID
into #TEMP
FROM TRANS_TABLE (NOLOCK)
SELECT TT.*
FROM TRANS_TABLE (NOLOCK) TT
INNER JOIN #TEMP TON TT.MYID = T.MYID
WHERE ROWNUM BETWEEN @START_ROW AND @START_ROW + @MAX_ROWS - 1
DROP TABLE #TEMP

以上便是这次为您介绍的 SQL Server 2005中几种分页方法,希望对您学习SQL Server分页查询方面能有所帮助。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 使用puppeteer实现将htmll转成pdf 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档 【译】将HTML转为PDF的几种实现方案 变形金刚08动画怎么样 乔迁对联大全带横批五字 中国人寿健康险是怎么分类的? 五字乔迁对联 给女儿成人礼上的一封信因怎样写 手机里面所谓的邮箱是什么? 女儿高三快毕业了.如何给女儿成人的寄语写信? 手机常用邮箱都有哪些 国企人力资源一年下来能拿多少 请问有谁是干人力资源的吗?能赚多少钱?具体工作是像秘书一样吗? 秋天为什么脸上起皮? 秋天脸上皮肤干燥脱皮怎么办? 为什么秋天的皮肤爱脱皮 做什么健身运动可以健身? 一个人可以做哪些运动来锻炼身体??? 人可以做那些运动~~! 为大家推荐几个在家也可以做的运动 哪些运动可以健身? 在生活中可以做哪些运动 热水器安装好在烧水中指示灯亮着亮着就不亮了是什么厡因? 有哪些又有趣又可以锻炼身体的运动? na+是什么意思? Na+是什么意思?? NA 是什么意思 为什么酷狗音乐播放不了,且出现:检测到当前音频设备异常,无法继续播放,点击后进入音频设置。如何解决 华为na5ipro以下架是什么意思? 电脑没有蓝牙驱动怎么安装 到2016年华为存储已经销售到全球多少个国家与地区 na客户 华为荣耀开机页面正常,就是进不去主页面,锁屏面显示马赛克的时间和NA和类似小茶壶的东西,怎么恢复 华为7i有d|na功能吗 开普芦荟的药用价值 不想关联苹果手机和平板怎么设置? 电脑原来没有蓝牙,可以装驱动使用蓝牙么? 电脑上没有蓝牙.怎样装一个蓝牙驱动? 中国精神作文100字? 财务报表中的“环比”“同比”是什么意思,对股票会产生什么影响? 农历6月13出生的是什么星座 股票中的同比和环比是什么意思 股票业绩里的环比是什么意思? 阴历6月13日是什么星座 股票当中环比增长什么意思!