SQL Server 2005快速Web分頁的實現
分頁,就是按照某種規則顯示分組資料集,但是在SQL Server中,分頁並不是十分容易就能夠實現。在過去,開發人員通常需要自己編寫程式,使用臨時表格來實現分頁功能,或者將所有的資料結果集返回到客戶端,在客戶端進行分頁操作。從開發人員或者DBA的角度來看,兩種方法都不能令人滿意。
隨著SQL Server的釋出,其中的一些排序函式使得開發人員編寫資料分頁程式變得更加簡單和高效。這些新的排序函式提供了統計資料集的數目,對資料集歸類,按照某種標準對資料集排序等功能。在這篇文章中,我將著重介紹新增加的ROW-NUMBER排序函式,它會根據你指定的分類標準將結果資料集進行分類,同時給資料集分配連續的頁面。
一個分頁的例項
我總是喜歡通過例子來介紹如何使用新技術,所以讓我們來看看如何設計一個儲存程式,使用ROW_NUMBER這一新函式來實現資料的自動分頁。
首先,需要定義一些資料結構。我們定義一個SalesHistory表格,它包含的資料是我們在網上售出產品的銷售記錄。包括一些常見的銷售資訊,例如,所售產品、售出日期、產品售出價格等。下面的指令碼就是建立這樣的一個表格:
以下為引用的內容:
IF OBJECT_ID('SalesHistory','U') > 0
DROP TABLE SalesHistory
CREATE TABLE SalesHistory
(
SaleID INT IDENTITY(1,1),
Product VARCHAR(30),
SaleDate SMALLDATETIME,
SalePrice MONEY
)
執行列表A中的指令碼則在上面建立的SalesHistory表中新增一些例子資料。
以下為引用的內容:
DECLARE @i SMALLINT
SET @i = 1
WHILE (@i <=100)
BEGIN
INSERT INTO SalesHistory
(Product, SaleDate, SalePrice)
VALUES
('Computer', DATEADD(mm, @i, '3/11/1919'),
DATEPART(ms, GETDATE()) + (@i + 57) )
INSERT INTO SalesHistory
(Product, SaleDate, SalePrice)
VALUES
('BigScreen', DATEADD(mm, @i, '3/11/1927'),
DATEPART(ms, GETDATE()) + (@i + 13) )
INSERT INTO SalesHistory
(Product, SaleDate, SalePrice)
VALUES
('PoolTable', DATEADD(mm, @i, '3/11/1908'),
DATEPART(ms, GETDATE()) + (@i + 29) )
SET @i = @i + 1
END
列表A
現在資料表中已經具有例項資料。接下來我們看看如何呼叫程式來實現資料的分頁顯示。列表B包含這個程式的指令碼內容。這個程式含有兩個引數:
1.頁面大小(給定頁面要顯示的資料記錄數目)。
2.目標頁面(返回該頁的資料記錄)。
以下為引用的內容:
CREATE PROCEDURE usp_SalesRecords
(
@PageSize FLOAT,
@TargetPage SMALLINT
)
AS
BEGIN
WITH Sales_CTE(PageNumber, SaleID, Product, SaleDate, SalePrice)
AS
(
SELECT
CEILING((ROW_NUMBER() OVER
ORDER BY SaleDate ASC))/@PageSize) AS PageNumber, SaleID,
Product, SaleDate, SalePrice
FROM SalesHistory FROM SalesHistory
)
SELECT
PageNumber, SaleID, Product, SaleDate, SalePrice
FROM
Sales_CTE
WHERE
PageNumber = @Targetpage
ENDCREATE PROCEDURE usp_SalesRecords
(
@PageSize FLOAT,
@TargetPage SMALLINT
)
AS
BEGIN
WITH Sales_CTE(PageNumber, SaleID, Product, SaleDate, SalePrice)
AS
(
SELECT
CEILING((ROW_NUMBER() OVER
(ORDER BY SaleDate ASC))/@PageSize) AS PageNumber, SaleID,
Product, SaleDate, SalePrice
FROM SalesHistory FROM SalesHistory
)
SELECT
PageNumber, SaleID, Product, SaleDate, SalePrice
FROM
Sales_CTE
WHERE
PageNumber = @Targetpage
END
列表B
如果你剛剛開始使用SQL Server,可能會不熟悉以“WITH”開頭的宣告語句。這條語句會呼叫SQL Server中的一個新屬性,我們稱之為common table expression(CTE),從本質上來說,我們可以將CTE看作是高版本的臨時表。
分頁的實質就是CTE中的TSQL語句。在下面的選擇語句中,我使用了一個新的排序函式——ROW_NUMBER(這一函式很容易使用,你只需要給ROW_NUMBER函式提供一個域名作為引數,ROW_NUMBER會用它來進行分頁)。隨後,我使用@PageSize引數來劃分每頁的行數以及每頁的最大行數值。
例如,假設現在有一個包含三條記錄的資料集,並設計每頁顯示兩條記錄,那麼頭兩條記錄將會在第一頁顯示,因為每頁的行數必須小於或者等於第一個變數值。第三條記錄將會在第二頁顯示,因為每頁的可顯示最大行數值應該小於2但是又大於1。
可以使用下面的指令碼呼叫儲存程式:
以下為引用的內容:
EXECUTE usp_SalesRecords
@PageSize = 3,
@TargetPage = 2
執行程式後的返回結果如下:
PageNumber
SaleID
Product
SaleDate
SalePrice
2
12
PoolTable
7/11/1908
0:00
640
2
15
PoolTable
8/11/1908
0:00
641
2
18
PoolTable
9/11/1908
0:00
658
就如你所看到的,程式執行後將會返回一頁的資料,包含三條記錄,而且返回的是第二頁的資料集。
注意:一般來說,有兩種方法完成資料結果的分頁:在資料庫層實現和不在資料庫層實現。可以在客戶端實現分頁,但是這樣做的時候,所有的資料都會返回到客戶端,而且在進行資料分析的時候就決定了頁面數目。在早期版本的SQL Server中,可以在資料庫層實現分頁,但是需要臨時表和表變數。如果上面的例子沒有使用CTE來進行分頁的話,分頁程式就不會那麼簡單。之所以這麼簡單就是因為使用了ROW_NUMBER函式的強大功能。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-544962/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL Server2005使用CTE實現遞迴QCSQLServer遞迴
- sql server 2005資料庫快照SQLServer資料庫
- 已安裝 SQL Server 2005 Express 工具。若要繼續,請刪除 SQL Server 2005 Express 工具SQLServerExpress
- MySql/Oracle和SQL Server的分頁查MySqlOracleServer
- web 實現分頁列印功能Web
- SQL Server 2005效能調整二(zt)SQLServer
- SQL Server 2005效能調整一(zt)SQLServer
- sql server 2005 資料修改的內部原理SQLServer
- SQL Server 2005的複製儲存過程選項BYSQLServer儲存過程
- SQL Server 2005詳細安裝過程及配置SQLServer
- 如何建立和還原SQL Server 2005資料庫?SQLServer資料庫
- 快速使用ChatGpt Web ServerChatGPTWebServer
- 分頁功能的實現
- 千萬條資料,Stack Overflow 是如何實現快速分頁的?
- Linux 版本的 SQL Server 快速安裝LinuxSQLServer
- 基於Sql server資料庫的四種分頁方式總結SQLServer資料庫
- MyBatis實現分頁的方式MyBatis
- Q&A:在SQL Server 2005中編寫儲存過程RVSQLServer儲存過程
- elementUI實現分頁UI
- MaxCompute如何對SQL查詢結果實現分頁獲取SQL
- SQL Server 2000/2005/2008刪除或壓縮資料庫日誌的方法SQLServer資料庫
- 如何將SQL Server 2000備份的資料庫檔案還原(升級)為SQL Server 2005或更高版本的資料庫?SQLServer資料庫
- web頁面錄屏實現Web
- 大資料量的報表如何快速分頁呈現?大資料
- mybatis-plus連線SQL Server2012分頁查詢異常MyBatisSQLServer
- PostgreSQL、Oracle/MySQL和SQL Server的MVCC實現原理方式OracleMySqlServerMVC
- 如何在SQL Server中實現 Limit m,n 的功能SQLServerMIT
- SQL Server的Merge —— 一步實現 insert,update,deleteSQLServerdelete
- Microsoft SQL Server 2005中查詢優化器使用的統計資訊一(zt)ROSSQLServer優化
- Microsoft SQL Server 2005中查詢優化器使用的統計資訊三(zt)ROSSQLServer優化
- Microsoft SQL Server 2005中查詢優化器使用的統計資訊二(zt)ROSSQLServer優化
- 高效資料移動指南 | 如何快速實現資料庫 SQL Server 到 Dameng 的資料同步?資料庫SQLServer
- web端 網頁端分享功能的實現Web網頁
- web網頁設計實現——04.16Web網頁
- SQL SERVER實用技巧SQLServer
- SQL Server 通過REVERSE實現C#中lastIndexOf的效果SQLServerC#ASTIndex
- 47.DRF實現分頁
- Java實現後端分頁Java後端
- Django 前端BootCSS 實現分頁Django前端bootCSS