在資料層實現分頁技術

2021-04-28 11:03:45 字數 3068 閱讀 9812

sqlserver2005 有乙個row-number函式,他針對select返回的每一行,從1開始編號,賦予其連續的編號。因為在查詢上應用了乙個排序的標準後,只有通過編號才能夠保證其順序是一致的。 select row-number()over(order by 列名)as row,列名 from 表名

例:select row ,name from(select row-number()over(order by productid)as row,name from product)as productwithrownumbers where row>=6 and row<=10

下面是乙個完整的儲存過程例子:

create procedure getproductsondepartmentpromotion

(@departmentid int,

@descriptionlength int,

@pagenumber int,

@productsperpage int,

@howmanyproducts int output)

as-- declare a new table variable

declare @products table

(rownumber int,

productid int,

name varchar(50),

description varchar(5000),

price money,

image1filename varchar(50),

image2filename varchar(50),

ondepartmentpromotion bit,

oncatalogpromotion bit)

-- populate the table variable with the complete list of products

insert into @products

select row_number() over (order by productid) as row,

productid, name, substring(description, 1, @descriptionlength) + '...' as description,

price, image1filename, image2filename, ondepartmentpromotion, oncatalogpromotion

from

(select distinct product.productid, product.name,

substring(product.description, 1, @descriptionlength) + '...' as description,

price, image1filename, image2filename, ondepartmentpromotion, oncatalogpromotion

from product inner join productcategory

on product.productid = productcategory.productid

inner join category

on productcategory.categoryid = category.categoryid

where product.ondepartmentpromotion = 1

and category.departmentid = @departmentid

) as productondeppr

-- return the total number of products using an output variable

select @howmanyproducts = count(productid) from @products

-- extract the requested page of products

select productid, name, description, price, image1filename,

image2filename, ondepartmentpromotion, oncatalogpromotion

from @products

where rownumber > (@pagenumber - 1) * @productsperpage

and rownumber <= @pagenumber * @productsperpage

前面介紹的方法不能在sqlsever2000中使用的,因為它不支援row-number函式。而是要使用乙個identity列,來產生你所需要的排序。identity列也可以和表變數和臨時表一起使用。淡然這個方法也可以再sqlsever2005中使用(事實上,在sqlserver2005中他執行的更好)。這個方法有個缺陷,因為sqlserver2000不能保證相同的順序填充臨時表,並且在兩次連續的查詢中,也無法保證每個行獲得相同的行號。最壞的情況例如:同樣的商品出現在不同的分頁上。和通過使用臨時表實現分頁技術所取得的效能改進相比,這只是乙個次要的缺點。

下面使用臨時表和identity列結合實現分頁

create table #products

row smallint not null identity(1,1),

productid int,

name varchar(50),

description varchar(50),

insert into #products(productid,name,description) select productid,name,description from product

select name,description from #products where row>=6 and row<=10

值得注意的是#表示乙個區域性臨時表,##表示乙個全域性臨時表,區域性臨時表是屬於建立它的資料庫連線的,而全域性臨時表在所有連線中都可見,本列使用了區域性臨時表,如果有多個使用者在同一時間執行搜尋,則每個使用者都將建立單獨的版本#products表,這是因為不同的使用者是通過不同的資料庫連線來訪問資料的,這裡就很容易想象,如果所有的連線使用單一的##products表,那就不能正確執行了。

資料分頁技術

幾乎所有的應用程式都會用到資料和資料庫。但在對於大資料量的訪問設計上,是有很多講究的。例如,我們需要在乙個頁面上顯示很多資料,我們可能會考慮分頁。net自帶的gridview控制項就能很容易地實現分頁,但是那樣做是否真的合理呢?除此之外,是否還有其他的方法呢?下面就特意拿了一些資料來比較一下 以下的...

JAVA WEB 實現分頁技術

這段時間因為專案需要,要做乙個分頁的功能,具體來說就是希望從資料庫每次只取一部分結果,這樣每頁就顯示那些結果,實現原理很簡單,就是建立乙個pageutil類,裡面放當前訪問的頁數 這個是從客戶瀏覽器傳到後台的資料,所以你的分頁需要用它來定位記錄的條目 和每一頁顯示的記錄行數。然後通過分頁計算就可以得...

使用DataList實現資料分頁的技術

今天做 的時候,用到了分頁技術,我把使用方法記錄下來,以便日後查閱以及幫助新手朋友們。datalist控制項可以按照列表的形式顯示資料表中的多行記錄,但是被顯示的多行記錄沒有分頁功能,使用起來不太方便。因此需要借助pageddatasource類來實現分頁,該類封裝了資料控制項的分頁屬性,其常用屬性...