最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2010年05月23日 02:41:48   作者:  
分頁存儲過程(二)在MS SQL Server中返回更加準(zhǔn)確的分頁結(jié)果
在我的使用SQL Server2005的新函數(shù)構(gòu)造分頁存儲過程中,我提到了使用ROW_NUMBER()函數(shù)來代替top實現(xiàn)分頁存儲過程。

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

復(fù)制代碼 代碼如下:

--使用row_unmber()實現(xiàn)分頁
--本來我們想要的結(jié)果是10條訂單,結(jié)果卻不是10條訂單,而是10條明細(xì)
--其實是針對的子表進(jìn)行分頁了,訂單并不是要顯示的個數(shù),出來的個數(shù)是明細(xì)的個數(shù)
--就是因為主表和子表聯(lián)合查詢的結(jié)果,主表記錄和子表記錄是1:N的關(guān)系,一個主表記錄有多個明細(xì)
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

結(jié)果如下圖

很明顯不是10條訂單,而是10條明細(xì)。

  下面是對查詢的一點改進(jìn),使用了游標(biāo)

復(fù)制代碼 代碼如下:

--解決上面的問題,有以下幾種辦法
--1、先根據(jù)條件查詢主表記錄,然后在C#代碼中循環(huán),再次到數(shù)據(jù)庫查詢每條主表記錄的明細(xì)信息,然后賦值給屬性
--2、在數(shù)據(jù)庫的存儲過程中使用游標(biāo),也是先查詢主表記錄,然后使用游標(biāo)循環(huán)的過程中,查詢子表信息,然后在C#中
--集中處理
--很顯然,后一種減少了數(shù)據(jù)庫的往來開銷,一次獲取了想要的數(shù)據(jù),個人認(rèn)為要比第一種好,歡迎大家一起討論更好的辦法
--需要注意的就是ROW_NUMBER()返回的類型是bigint,而不是int
--下面是游標(biāo)的存儲過程
--建立主表臨時表
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
)
--插入主表數(shù)據(jù)到主表臨時表
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
--定義游標(biāo)
DECLARE @temp_cursor CURSOR
--給游標(biāo)賦值
SET @temp_cursor=CURSOR FOR SELECT #temp.orderseqno,#temp.goodsname FROM #temp
--定義游標(biāo)循環(huán)過程中所需保存的臨時數(shù)據(jù)
DECLARE @orderseqno VARCHAR(36),@goodsname varchar(50)
--打開游標(biāo)
OPEN @temp_cursor
FETCH NEXT FROM @temp_cursor INTO @orderseqno,@goodsname
--循環(huán)游標(biāo),查詢子表數(shù)據(jù),然后插入子表臨時表
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
--關(guān)閉游標(biāo)
CLOSE @temp_cursor
DEALLOCATE @temp_cursor
SELECT * FROM #temp
SELECT * FROM #detail
--刪除臨時表
DROP TABLE #temp
DROP TABLE #detail

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

 

  上面的T-SQL只在SQL Server 2005上調(diào)試成功。
推薦一篇MS SQL Server的查詢計劃的相關(guān)內(nèi)容,可以利用它優(yōu)化SQL,寫的不錯。引用:SqlServer 執(zhí)行計劃及Sql查詢優(yōu)化初探

相關(guān)文章

  • 跨數(shù)據(jù)庫實現(xiàn)數(shù)據(jù)交流

    跨數(shù)據(jù)庫實現(xiàn)數(shù)據(jù)交流

    這篇文章主要介紹了跨數(shù)據(jù)庫實現(xiàn)數(shù)據(jù)交流的兩種方式,一是通過鏈接服務(wù)器,二是使用OPENDATASOURCE/OPENROWSET連接遠(yuǎn)程服務(wù)器,需要的朋友可以參考下
    2015-08-08
  • SQL Server 獲取服務(wù)器時間的sql語句

    SQL Server 獲取服務(wù)器時間的sql語句

    這篇文章主要介紹了SQL Server 獲取服務(wù)器時間的sql語句,需要的朋友可以參考下
    2016-07-07
  • SQL Function 自定義函數(shù)詳解

    SQL Function 自定義函數(shù)詳解

    這篇文章主要介紹了SQL Function 自定義函數(shù)詳解,需要的朋友可以參考下
    2016-10-10
  • SQLServer創(chuàng)建索引的5種方法小結(jié)

    SQLServer創(chuàng)建索引的5種方法小結(jié)

    本文主要介紹了SQLServer創(chuàng)建索引的5種方法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • sql?server如何去除數(shù)據(jù)中的一些無用的空格

    sql?server如何去除數(shù)據(jù)中的一些無用的空格

    這篇文章主要介紹了sql?server去除數(shù)據(jù)中的一些無用的空格,本文給大家提到了一些常用的函數(shù),結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • SQL JOIN 連接詳細(xì)介紹及簡單使用實例

    SQL JOIN 連接詳細(xì)介紹及簡單使用實例

    這篇文章主要介紹了SQL JOIN 連接詳細(xì)介紹及簡單使用實例的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • dbeaver配置SQL?server連接實現(xiàn)

    dbeaver配置SQL?server連接實現(xiàn)

    本文主要介紹了dbeaver配置SQL?server連接實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 關(guān)于if?exists的用法及說明

    關(guān)于if?exists的用法及說明

    這篇文章主要介紹了關(guān)于if?exists的用法及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • MS SQL Server游標(biāo)(CURSOR)的學(xué)習(xí)使用

    MS SQL Server游標(biāo)(CURSOR)的學(xué)習(xí)使用

    使用MS SQL Server這樣久,游標(biāo)一直沒有使用過。以前都是使用WHILE循環(huán)加臨時表來實現(xiàn)。剛剛聯(lián)系個示例了解到游標(biāo)概念與語法
    2014-06-06
  • SQL中的單條件判斷函數(shù)IF和多條件判斷CASE WHEN的用法

    SQL中的單條件判斷函數(shù)IF和多條件判斷CASE WHEN的用法

    MySQL提供了IF、IFNULL、CASE等條件判斷函數(shù),本文就來介紹一下SQL中的單條件判斷函數(shù)IF和多條件判斷CASE WHEN的用法,感興趣的可以了解一下
    2023-10-10

最新評論

辉县市| 安西县| 新竹市| 鹤庆县| 泌阳县| 克拉玛依市| 南阳市| 丹东市| 江华| 吴旗县| 丰镇市| 泰安市| 上蔡县| 磴口县| 黔西| 塔城市| 当阳市| 淮滨县| 日照市| 耿马| 驻马店市| 涟源市| 永川市| 鹤峰县| 酉阳| 南靖县| 垦利县| 名山县| 木兰县| 巴林左旗| 拉孜县| 定日县| 昌乐县| 论坛| 和硕县| 正宁县| 女性| 阿荣旗| 东台市| 佛教| 彰武县|