資源描述:
《簡析基于sqlserver分頁存儲過程的演進》由會員上傳分享,免費在線閱讀,更多相關內容在應用文檔-天天文庫。
1、簡析基于SQLSERVER分頁存儲過程的演進>>教育資源庫 針對數據庫數據在UI界面上的分頁是老生常談的問題了,網上很容易找到各種通用存儲過程代碼,而且有些還定制查詢條件,看上去使用很方便。筆者打算通過本文也來簡單談一下基于SQLSERVER2000的分頁存儲過程,同時談談SQLSERVER2005下分頁存儲過程的演進?! ≡谶M行基于UI顯示的數據分頁時,常見的數據提取方式主要有兩種。第一種是從數據庫提取所有數據然后在系統(tǒng)應用程序層進行數據分頁,顯示當前頁數據。第二種分頁方式為從數據庫取出需要顯示的一
2、頁數據顯示在UI界面上。 以下是筆者對兩種實現(xiàn)方式所做的優(yōu)缺點比較,針對應用程序編寫,筆者以.技術平臺為例?! ☆悇e SQL語句 代碼編寫 設計時 性能 第一種 語句簡單,兼容性好 很少 完全支持 數據越大性能越差 第二種 看具體情況 較多 部分支持 良好,跟SQL語句有關 對于第一種情況本文不打算舉例,第二種實現(xiàn)方式筆者只以兩次TOP方式來進行討論?! ≡诰帉懢唧wSQL語句之前,定義以下數據表?! 祿砻Q為:Production.Product。Production
3、為SQLSERVER2005中改進后的數據表架構,對舉例不造成影響?! “淖侄螢椋骸 ×忻 祿愋汀 ≡试S空 說明 ProductID Int 產品ID,PK?! ame Nvarchar(50) 產品名稱?! 〔浑y發(fā)現(xiàn)以上表結構來自SQLSERVER2005樣例數據庫AdventureProduction.Product/*計算頁面數據*/SETPageCount=CEILING(RecordCount*1.0/PageSize)/*TOP記錄數*/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) 以上存儲過程對頁數進行判斷,如果是第一頁或最后一頁,進行特殊處理。其他情況使用2次TOP翻轉。其中排序條件為ProductID倒序。最后通過EXECUTE執(zhí)行SQL字符串拼串。2.SQLSERVER2005中的TOP分頁CREATEPROCEDURE[dbo].[Zhzuo_GetItemsPage
7、2005TOP]PageIndexINT,PageSizeINT,RecordCountINTOUT,PageCountINTOUTAS/*獲取記錄數*/SELECTRecordCount=COUNT(*)FROMProduction.Product/*計算頁面數據*/SETPageCount=CEILING(RecordCount*1.0/PageSize)/*TOP記錄數*/DECLARETOPCOUNTINTSETTOPCOUNT=RecordCount-PageSize*PageIndex/*基
8、于SQLSERVER2005*/IFPageIndex=0ORPageCount<=1BEGINSELECTTOP(PageSize)ProductID,NameFROMProduction.ProductORDERBYProductIDDESCENDELSEBEGINIFPageIndex=PageCount-1BEGINSELECT*FROM(SELECTTOP(TOPCOUNT)ProductID,NameFROMProduct