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類來實現分頁,該類封裝了資料控制項的分頁屬性,其常用屬性...