激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Sql Server - 分頁存儲過程(二)在sqlserver中返回更加準確的分頁結果

分頁存儲過程(二)在sqlserver中返回更加準確的分頁結果

2019-11-23 18:44MSSQL教程網 Sql Server

分頁存儲過程(二)在MS SQL Server中返回更加準確的分頁結果

在我的使用SQL Server2005的新函數構造分頁存儲過程中,我提到了使用ROW_NUMBER()函數來代替top實現分頁存儲過程。 

但是時間長了,又發現了新問題,就是主子表的分頁查詢。例如:訂單表和訂單明細表,要求是查詢訂單,第二頁,每頁10條 

復制代碼代碼如下:


--使用row_unmber()實現分頁 
--本來我們想要的結果是10條訂單,結果卻不是10條訂單,而是10條明細 
--其實是針對的子表進行分頁了,訂單并不是要顯示的個數,出來的個數是明細的個數 
--就是因為主表和子表聯合查詢的結果,主表記錄和子表記錄是1:N的關系,一個主表記錄有多個明細 
select * from 
(SELECT ROW_NUMBER () OVER (ORDER 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 


結果如下圖

分頁存儲過程(二)在sqlserver中返回更加準確的分頁結果

很明顯不是10條訂單,而是10條明細。

  下面是對查詢的一點改進,使用了游標

復制代碼代碼如下:


--解決上面的問題,有以下幾種辦法 
--1、先根據條件查詢主表記錄,然后在C#代碼中循環,再次到數據庫查詢每條主表記錄的明細信息,然后賦值給屬性 
--2、在數據庫的存儲過程中使用游標,也是先查詢主表記錄,然后使用游標循環的過程中,查詢子表信息,然后在C#中 
--集中處理 
--很顯然,后一種減少了數據庫的往來開銷,一次獲取了想要的數據,個人認為要比第一種好,歡迎大家一起討論更好的辦法 
--需要注意的就是ROW_NUMBER()返回的類型是bigint,而不是int 
--下面是游標的存儲過程 
--建立主表臨時表 
CREATE TABLE #temp 

rownumber bigint, 
orderseqno VARCHAR(36), 
goodsname VARCHAR(50), 
companyname VARCHAR(100) 

--建立子表臨時表 
CREATE TABLE #detail 

orderseqno VARCHAR(36), 
detailid UNIQUEIDENTIFIER, 
unitprice DECIMAL(12,2), 
Qty int 

--插入主表數據到主表臨時表 
insert into #temp 
SELECT oo.rownumber, oo.OrderSeqNO, oo.GoodsName, oo.CompanyName FROM 
(SELECT ROW_NUMBER () OVER (ORDER BY oi.createdate DESC) AS rownumber, 
oi.OrderSeqNO, oi.GoodsName ,ci.CompanyName 
FROM OrderInfo oi INNER JOIN CompanyInfo ci ON oi.CompanyID=ci.CompanyID 
WHERE oi.CreateDate<GETDATE() 
) AS oo 
WHERE rownumber BETWEEN 10 AND 20 
--定義游標 
DECLARE @temp_cursor CURSOR 
--給游標賦值 
SET @temp_cursor=CURSOR FOR SELECT #temp.orderseqno,#temp.goodsname FROM #temp 
--定義游標循環過程中所需保存的臨時數據 
DECLARE @orderseqno VARCHAR(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 


結果如下圖,馬上看到效果就變了,歡迎大家一起討論更好的,更精準的分頁查詢。

 

分頁存儲過程(二)在sqlserver中返回更加準確的分頁結果

 

  上面的T-SQL只在SQL Server 2005上調試成功。
推薦一篇MS SQL Server的查詢計劃的相關內容,可以利用它優化SQL,寫的不錯。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 女人久久久www免费人成看片 | 中国大陆一级毛片 | 在线中文资源免费 | 久久精品视频国产 | 免费看污视频在线观看 | 久久草在线观看视频 | 免费视频a | 国产精品久久久久国产精品三级 | 性生活视频网站 | 麻豆视频在线观看免费网站 | 久久久久一区 | 国产69精品99久久久久久宅男 | 一区二区三区国产在线 | 日本成人在线免费 | 九九热免费视频在线观看 | 精品国产一区二区三区在线 | 一级大片一级一大片 | 91精品国产一区二区在线观看 | 91成人影院 | 91社区在线观看 | 国产精品午夜一区 | 欧美一级淫片免费视频黄 | av免费在线免费观看 | 日韩一级免费毛片 | 午夜精品久久久久久毛片 | 激情视频免费看 | 粉嫩粉嫩一区二区三区在线播放 | 香蕉视频网站在线观看 | 色视频欧美 | 亚洲xxx在线观看 | 鲁丝片一区二区三区免费入口 | 国产一区二区三区四区五区在线 | 国产成人精品自拍视频 | 一区二区三区日韩在线 | 护士hd欧美free性xxxx | 蜜桃成品人免费视频 | 精品一区二区亚洲 | 看毛片的网址 | 国产精品一区二区手机在线观看 | 美女黄页网站免费进入 | 久久久aa |