資源描述:
《簡析基于sqlserver分頁存儲過程的演進》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、簡析基于SQLSERVER分頁存儲過程的演進>>教育資源庫 針對數(shù)據(jù)庫數(shù)據(jù)在UI界面上的分頁是老生常談的問題了,網(wǎng)上很容易找到各種通用存儲過程代碼,而且有些還定制查詢條件,看上去使用很方便。筆者打算通過本文也來簡單談一下基于SQLSERVER2000的分頁存儲過程,同時談?wù)凷QLSERVER2005下分頁存儲過程的演進?! ≡谶M行基于UI顯示的數(shù)據(jù)分頁時,常見的數(shù)據(jù)提取方式主要有兩種。第一種是從數(shù)據(jù)庫提取所有數(shù)據(jù)然后在系統(tǒng)應(yīng)用程序?qū)舆M行數(shù)據(jù)分頁,顯示當前頁數(shù)據(jù)。第二種分頁方式為從數(shù)據(jù)庫取出需要顯示的一
2、頁數(shù)據(jù)顯示在UI界面上?! ∫韵率枪P者對兩種實現(xiàn)方式所做的優(yōu)缺點比較,針對應(yīng)用程序編寫,筆者以.技術(shù)平臺為例?! ☆悇e SQL語句 代碼編寫 設(shè)計時 性能 第一種 語句簡單,兼容性好 很少 完全支持 數(shù)據(jù)越大性能越差 第二種 看具體情況 較多 部分支持 良好,跟SQL語句有關(guān) 對于第一種情況本文不打算舉例,第二種實現(xiàn)方式筆者只以兩次TOP方式來進行討論?! ≡诰帉懢唧wSQL語句之前,定義以下數(shù)據(jù)表?! ?shù)據(jù)表名稱為:Production.Product。Production
3、為SQLSERVER2005中改進后的數(shù)據(jù)表架構(gòu),對舉例不造成影響。 包含的字段為: 列名 數(shù)據(jù)類型 允許空 說明 ProductID Int 產(chǎn)品ID,PK?! ame Nvarchar(50) 產(chǎn)品名稱?! 〔浑y發(fā)現(xiàn)以上表結(jié)構(gòu)來自SQLSERVER2005樣例數(shù)據(jù)庫AdventureProduction.Product/*計算頁面數(shù)據(jù)*/SETPageCount=CEILING(RecordCount*1.0/PageSize)/*TOP記錄數(shù)*/DECLARETOPCOUNT
4、INTSETTOPCOUNT=RecordCount-PageSize*PageIndexDECLARESQLSTRNVARCHAR(1000)IFPageIndex=0ORPageCount<=1BEGINSETSQLSTR=N'SELECTTOP'+STR(PageSize)+'ProductID,NameFROMProduction.ProductORDERBYProductIDDESC'ENDELSEBEGINIFPageIndex=PageCount-1B
5、EGINSETSQLSTR=N'SELECT*FROM(SELECTTOP'+STR(TOPCOUNT)+'ProductID,NameFROMProduction.ProductORDERBYProductIDASC)TORDERBYProductIDDESC'ENDELSEBEGINSETSQLSTR=N'SELECTTOP'+STR(PageSize)+'*FROM(SELECTTOP'+STR(TOPCOUNT)+'Prod
6、uctID,NameFROMProduction.ProductORDERBYProductIDASC)TORDERBYProductIDDESC'ENDEND/*執(zhí)行*/EXEC(SQLSTR) 以上存儲過程對頁數(shù)進行判斷,如果是第一頁或最后一頁,進行特殊處理。其他情況使用2次TOP翻轉(zhuǎn)。其中排序條件為ProductID倒序。最后通過EXECUTE執(zhí)行SQL字符串拼串。2.SQLSERVER2005中的TOP分頁CREATEPROCEDURE[dbo].[Zhzuo_GetItemsPage
7、2005TOP]PageIndexINT,PageSizeINT,RecordCountINTOUT,PageCountINTOUTAS/*獲取記錄數(shù)*/SELECTRecordCount=COUNT(*)FROMProduction.Product/*計算頁面數(shù)據(jù)*/SETPageCount=CEILING(RecordCount*1.0/PageSize)/*TOP記錄數(shù)*/DECLARETOPCOUNTINTSETTOPCOUNT=RecordCount-PageSize*PageIndex/*基
8、于SQLSERVER2005*/IFPageIndex=0ORPageCount<=1BEGINSELECTTOP(PageSize)ProductID,NameFROMProduction.ProductORDERBYProductIDDESCENDELSEBEGINIFPageIndex=PageCount-1BEGINSELECT*FROM(SELECTTOP(TOPCOUNT)ProductID,NameFROMProduct