分页存储过程在sqlserver中返回更加准确的分页结果,返回更加准确的分页

很显眼不是10条订单,而是10条明细。

有人建议游标糟糕,会锁定行,幸而笔者锁定的是有的时候表,不是数据表,不影响数据表的写操作。
下边是14楼的过来,让自家听君一席谈共君一夜话胜读十年书,于是有了明天的更正版,撤消了游标的采用,有时表还是存在的,多谢。
其实你如若分成若干遍查询就能够: 1, 照旧用Row_兴發国际娱乐手机登录,Number查主表分页 2,
Row_Number查主表分页 inner join 明细表..用不到游标的. 复制代码 代码如下: –不用游标的分页
–先将分页的主表放在临时表中,然后用临时表和子表联合查询,来获取子表音讯–既保障了分页的准确性,也囊括了子表消息 CREATE TABLE #order ( number
BIGINT, orderseqno VARCHAR(36), ) insert into #order SELECT * FROM
(SELECT ROW_NUMBER() OVER (ORDER BY oi.CreateDate DESC) AS
rownumber,oi.OrderSeqNO FROM OrderInfo oi WHERE oi.OrderSeqNO LIKE ‘%2%’
) AS o WHERE o.rownumber BETWEEN 10 AND 20 SELECT * FROM #order INNER
JOIN OrderDetail od ON od.OrderSeqNO=#order.orderseqno DROP TABLE
#order 复制代码 代码如下: –SELECT TOP
10 oi.OrderSeqNO, oi.GoodsName ,ci.CompanyName,od.* –FROM OrderInfo oi
INNER JOIN CompanyInfo ci ON oi.CompanyID=ci.CompanyID –LEFT JOIN
OrderDetail od ON oi.OrderSeqNO=od.OrderSeqNO
–使用row_unmber(State of Qatar完成分页
–本来我们想要的结果是10条订单,结果却不是10条订单,而是10条明细
–其实是指向的子表进行分页了,订单并不是要呈现的个数,出来的个数是稳重的个数
–正是因为主表和子表联合查询的结果,主表记录和子表记录是1:N的关联,二个主表记录有多个明细
–建构聚焦索引 — CLUSTERED INDEX INDEX_OrderInfo ON OrderInfo
(OrderSeqNo卡塔尔国 –突显查询施行布署 –SET STATISTICS IO ON select * from
(SELECT ROW_NUMBE路虎极光 (卡塔尔国 OVEPRADO (O冠道DEPAJERO BY oi.createdate DESC卡塔尔(قطر‎ AS
rownumber,oi.orderseqno ,od.OrderDetailID FROM OrderInfo oi LEFT JOIN
OrderDetail od ON oi.OrderSeqNO=od.OrderSeqNO WHERE oi.OrderSeqNO LIKE
‘%2%’ 卡塔尔(قطر‎ AS o WHERE rownumber BETWEEN 10 AND 20 –不用游标的分页
–先将分页的主表放在偶尔表中,然后用临时表和子表联合查询,来收获子表信息–既保障了分页的正确,也席卷了子表新闻 CREATE TABLE #order ( number
BIGINT, orderseqno VARCHAR(36), ) insert into #order SELECT * FROM
(SELECT ROW_NUMBER() OVER (ORDER BY oi.CreateDate DESC) AS
rownumber,oi.OrderSeqNO FROM OrderInfo oi WHERE oi.OrderSeqNO LIKE ‘%2%’
) AS o WHERE o.rownumber BETWEEN 10 AND 20 SELECT * FROM #order INNER
JOIN OrderDetail od ON od.OrderSeqNO=#order.orderseqno DROP TABLE
#order –消除地点的标题,有以下二种办法
–1、先依照规范查询主表记录,然后在C#代码中循环,再一次到数据库查询每条主表记录的缜密音讯,然后赋值给属性
–2、在数据库的蕴藏进度中应用游标,也是先查询主表记录,然后接纳游标循环的进度中,查询子表音讯,然后在C#中
–集中管理–很扎眼,后一种减弱了数据库的过往花销,叁回获得了想要的数目,个人认为要比第一种好,接待我们一道议论越来越好的点子
–须求潜心的就是ROW_NUMBE大切诺基(卡塔尔(قطر‎再次回到的品种是bigint,并非int
–上边是游标的贮存进度 –创建主表有的时候表 CREATE TABLE #temp ( rownumber
bigint, orderseqno VARCHAXC60(36State of Qatar, goodsname VARCHA陆风X8(50卡塔尔, companyname
VARCHAEscort(100卡塔尔国 State of Qatar –创立子表临时表 CREATE TABLE #detail ( orderseqno
VARCHATucson(36卡塔尔国, detailid UNIQUEIDENTIFIEHighlander, unitprice DEPASSATL(12,2卡塔尔(قطر‎, Qty int
卡塔尔(قطر‎ –插入主表数据到主表不经常表 insert into #temp SELECT *
–oo.rownumber, oo.OrderSeqNO, oo.GoodsName, oo.CompanyName FROM (SELECT
ROW_NUMBELX570 (卡塔尔 OVETiguan (O奇骏DE冠道 BY oi.createdate DESC卡塔尔 AS rownumber,
oi.OrderSeqNO, oi.GoodsName ,ci.CompanyName FROM OrderInfo oi INNE大切诺基 JOIN
CompanyInfo ci ON oi.CompanyID=ci.CompanyID WHERE oi.CreateDateGETDATE(State of Qatar卡塔尔 AS oo WHERE rownumber BETWEEN 10 AND 20 –定义游标 DECLARE
@temp_cursor CULANDSO奇骏 –给游标赋值 SET @temp_cursor=CURSOR FOR SELECT
#temp.orderseqno,#temp.goodsname FROM #temp
–定义游标循环进程中所需保留的权且数据 DECLARE @orderseqno
VARCHAHighlander(36卡塔尔国,@goodsname varchar(50State of Qatar –展开游标 OPEN @temp_cursor FETCH
NEXT FROM @temp_cursor INTO @orderseqno,@goodsname
–循环游标,查询子表数据,然后插入子表有时表 WHILE @@FETCH_STATUS=0
BEGIN INSERT INTO #detail SELECT od.OrderSeqNO,od.OrderDetailID,
od.UnitPrice,od.Qty FROM OrderDetail od WHERE od.OrderSeqNO=@orderseqno
FETCH NEXT FROM @temp_cursor INTO @orderseqno,@goodsname END –关闭游标
CLOSE @temp_cursor DEALLOCATE @temp_cursor SELECT * FROM #temp
SELECT * FROM #detail –删除不时表 DROP TABLE #temp DROP TABLE
#detail

下面是对查询的少数纠正,使用了游标复制代码 代码如下:
–杀绝地点的主题素材,有以下三种艺术
–1、先依据法则查询主表记录,然后在C#代码中循环,再度到数据库查询每条主表记录的有心人音信,然后赋值给属性
–2、在数据库的存款和储蓄进程中动用游标,也是先查询主表记录,然后使用游标循环的经过中,查询子表新闻,然后在C#中
–聚集处理–很了解,后一种压缩了数据库的往来费用,叁遍获得了想要的数量,个人感到要比第一种好,招待大家协同研讨越来越好的不二法门–供给介意的就是ROW_NUMBELAND(卡塔尔(قطر‎再次回到的项目是bigint,实际不是int
–上面是游标的积存进度 –构建主表偶尔表 CREATE TABLE #temp ( rownumber
bigint, orderseqno VARCHAR(36卡塔尔, goodsname VARCHA凯雷德(50State of Qatar, companyname
VARCHATiggo(100卡塔尔(قطر‎ 卡塔尔(قطر‎ –创设子表不时表 CREATE TABLE #detail ( orderseqno
VARCHA兰德酷路泽(36卡塔尔, detailid UNIQUEIDENTIFIETiguan, unitprice DEGran LavidaL(12,2卡塔尔国, Qty int
State of Qatar –插入主表数据到主表一时表 insert into #temp SELECT oo.rownumber,
oo.OrderSeqNO, oo.GoodsName, oo.CompanyName FROM (SELECT ROW_NUMBE纳瓦拉 (卡塔尔国OVE宝马X5 (O凯雷德DECRUISER BY oi.createdate DESC卡塔尔国 AS rownumber, oi.OrderSeqNO,
oi.GoodsName ,ci.CompanyName FROM OrderInfo oi INNEPAJERO JOIN CompanyInfo ci
ON oi.CompanyID=ci.CompanyID WHERE oi.CreateDateGETDATE(卡塔尔 卡塔尔(قطر‎ AS oo WHERE
rownumber BETWEEN 10 AND 20 –定义游标 DECLARE @temp_cursor CULacrosseSOPRADO–给游标赋值 SET @temp_cursor=CURSOR FOR SELECT
#temp.orderseqno,#temp.goodsname FROM #temp
–定义游标循环进程中所需保存的暂且数据 DECLARE @orderseqno
VARCHA本田CR-V(36卡塔尔国,@goodsname varchar(50卡塔尔 –张开游标 OPEN @temp_cursor FETCH
NEXT FROM @temp_cursor INTO @orderseqno,@goodsname
–循环游标,查询子表数据,然后插入子表一时表 WHILE @@FETCH_STATUS=0
BEGIN INSERT INTO #detail SELECT od.OrderSeqNO,od.OrderDetailID,
od.UnitPrice,od.Qty FROM OrderDetail od WHERE od.OrderSeqNO=@orderseqno
FETCH NEXT FROM @temp_cursor INTO @orderseqno,@goodsname END –关闭游标
CLOSE @temp_cursor DEALLOCATE @temp_cursor SELECT * FROM #temp
SELECT * FROM #detail –删除有的时候表 DROP TABLE #temp DROP TABLE
#detail
结果如下图,立刻来看效果就变了,应接大家一道谈谈更加好的,越来越精准的分页查询。

下边包车型大巴T-SQL只在SQL Server 二〇〇七上调解成

上边包车型客车T-SQL只在SQL Server 2007上调度成功。推荐一篇MS SQL
Server的询问陈设的连带内容,可以运用它优化SQL,写的正确性。援用:SqlServer
实行安排及Sql查询优化初探

复制代码 代码如下:–消除地点的标题,有以下三种方式–1、先依据条件查询主表记录,然后在C#代码中循环,再次到数据库教程查询每条主表记录的精雕细刻音讯,然后赋值给属性
–2、在数据库的仓库储存进度中利用游标,也是先查询主表记录,然后利用游标循环的长河中,查询子表新闻,然后在C#中
–聚集管理–很明显,后一种收缩了数据库的过往开支,一回取得了想要的数据,个人认为要比第一种好,款待大家一起座谈越来越好的必定要经过的道路–须求在意的正是ROW_NUMBETiggo(卡塔尔再次来到的种类是bigint,并不是int
–上边是游标的积存进度 –创立主表一时表 CREATE TABLE #temp ( rownumber
bigint, orderseqno VARCHAMurano(36卡塔尔国, goodsname VARCHA大切诺基(50卡塔尔(قطر‎, companyname
VARCHA中华V(100卡塔尔 卡塔尔(قطر‎ –创设子表临时表 CREATE TABLE #detail ( orderseqno
VARCHAQX56(36卡塔尔国, detailid UNIQUEIDENTIFIETiggo, unitprice DE探岳L(12,2卡塔尔(قطر‎, Qty int
卡塔尔 –插入主表数据到主表一时表 insert into #temp SELECT oo.rownumber,
oo.OrderSeqNO, oo.GoodsName, oo.CompanyName FROM (SELECT ROW_NUMBELX570 (卡塔尔国OVE奥迪Q7 (OLX570DEPRADO BY oi.createdate DESCState of Qatar AS rownumber, oi.OrderSeqNO,
oi.GoodsName ,ci.CompanyName FROM OrderInfo oi INNEEvoque JOIN CompanyInfo ci
ON oi.CompanyID=ci.CompanyID WHERE oi.CreateDateGETDATE(State of Qatar State of Qatar AS oo WHERE
rownumber BETWEEN 10 AND 20 –定义游标 DECLARE @temp_cursor CUSportageSOPAJERO–给游标赋值 SET @temp_cursor=CURSOR FOR SELECT
#temp.orderseqno,#temp.goodsname FROM #temp
–定义游标循环进程中所需保留的一时半刻数据 DECLARE @orderseqno
VARCHAHuracán(36卡塔尔(قطر‎,@goodsname varchar(50卡塔尔国 –打开游标 OPEN @temp_cursor FETCH
NEXT FROM @temp_cursor INTO @orderseqno,@goodsname
–循环游标,查询子表数据,然后插入子表有的时候表 WHILE @@FETCH_STATUS=0
BEGIN INSERT INTO #detail SELECT od.OrderSeqNO,od.OrderDetailID,
od.UnitPrice,od.Qty FROM OrderDetail od WHERE od.OrderSeqNO=@orderseqno
FETCH NEXT FROM @temp_cursor INTO @orderseqno,@goodsname END –关闭游标
CLOSE @temp_cursor DEALLOCATE @temp_cursor SELECT * FROM #temp
SELECT * FROM #detail –删除一时表 DROP TABLE #temp DROP TABLE
#detail

很扎眼不是10条订单,而是10条明细。

发表评论

电子邮件地址不会被公开。 必填项已用*标注