Относно "странирането" на данни
1. Пример с ADO страниране
2. Пример със Stored procedure на MsSQL Server
3. Transact-SQL server cursor
=====================================
1. Пример с ADO страниране
Това за което Иво говори (PageSize, AbsolutePage, PageCount) такива примери има на:
Database Paged Search
http://www.asp101.com/samples/db_paged_search.asp
Database Paging
http://www.asp101.com/samples/db_paging.asp
е вярно примерите са на ASP и базата от данни е Access, но може да се ползва начина.
=====================================
2. Примрер със Stored procedure на MsSQL Server
Примера е от книгата Active Server Pages 3.0 на Wrox Press, преведена на бълг. от издателство "Софт Прес" (това не е реклама :)).
На стр. 537 Глава 10, има "Използване на SQL Server за страниране на набор от записи" - и там си е обяснено подробно каква логика ползват.
С 2 думи правят следното:
а) в stored procedure създават временна таблица #PagedAuthors с колона ID от тип int и свойство identity
това им гарантира уникалност на всеки ред (естествено :))
б) insert into #PagedAuthors .... select from "истинската таблица" where .....
с тази заявка прехвърлят нужните данни във "временната" таблица
в) калкулират общ брой на страници
г) за да се изберат записи само от търсената страница се изчислява ID-то на началния ред, и ID-то на крайния ред за търсената страница
д) записите от "страницата" изчислена в г) се предават на клиента
е) временната таблица се унищожава
а и на края - процедурата се вика с
@iPage -- номер на "страницата" която да се предаде към клиента
@iPageSize -- брой записи в "страница"
exec usp_PagedAuthors 2, 5 -- втора страница, на всяка страница по 5 реда
ето и процедурата - примера работа с база от данни pubs
------------------------------------------------------
CREATE PROCEDURE usp_PagedAuthors
@iPage int,
@iPageSize int
AS
BEGIN
-- disable row counts
SET NOCOUNT ON
-- declare variables
DECLARE @iStart int -- start record
DECLARE @iEnd int -- end record
DECLARE @iPageCount int -- total number of pages
-- create the temporary table
CREATE TABLE #PagedAuthors
(
ID int IDENTITY,
au_id varchar(11) NOT NULL ,
au_lname varchar(40) NOT NULL ,
au_fname varchar(20) NOT NULL ,
phone char(12) NOT NULL ,
address varchar(40) NULL ,
city varchar(20) NULL ,
state char(2) NULL ,
zip char(5) NULL ,
contract bit NOT NULL
)
-- populate the temporary table
INSERT INTO #PagedAuthors (au_id, au_lname, au_fname,
phone, address, city, state, zip, contract)
SELECT au_id, au_lname, au_fname,
phone, address, city, state, zip, contract
FROM authors
-- work out how many pages there are in total
SELECT @iPageCount = COUNT(*)
FROM authors
SELECT @iPageCount = CEILING(@iPageCount / @iPageSize) + 1
-- check the page number
IF @iPage < 1
SELECT @iPage = 1
IF @iPage > @iPageCount
SELECT @iPage = @iPageCount
-- calculate the start and end records
SELECT @iStart = (@iPage - 1) * @iPageSize
SELECT @iEnd = @iStart + @iPageSize + 1
-- select only those records that fall within our page
SELECT au_id, au_lname, au_fname,
phone, address, city, state, zip, contract
FROM #PagedAuthors
WHERE ID > @iStart
AND ID < @iEnd
DROP TABLE #PagedAuthors
-- turn back on record counts
SET NOCOUNT OFF
-- Return the number of records left
RETURN @iPageCount
END
------------------------------------------------------
=====================================
3. Transact-SQL server cursor
Доколкото съм чул MsSQL Server е слаб в процедурната си логика.
Може би затова Microsoft не препоръчва ползването на курсори???
Според мен просто трябва да се преценят (или тестват) различните начини.
Например:
Струва ми се, че ако се ползва Server cursor, това ще доведе до по-голям overhead на SQL Server-а, отколкото ако го караме да прави временни таблици. Знае ли човек? :)
|