Въпрос
11 отговора
658 прегледа
Въпрос
Може ли да попитам нещо, сори ако е много елементарно.
Имам таблица и заявка, на която искам да получа като резултат само записите от X до X+N от целия резултат.
Целта е да покажа резултата "страниран", искам да избегна получаването на всички резултати от сървъра и само да "показвам" после тези, които трябва. Това понеже резултатата може да са 10000 записа, а аз да кажем искам да дисплейна само тези от 9000 до 9010.
Заявката е от типа SELECT x FROM t WHERE y, сървъра е SQL2000.
Ще дам повече подробности ако трябва..
Много съм тъп.
Имам таблица и заявка, на която искам да получа като резултат само записите от X до X+N от целия резултат.
Целта е да покажа резултата "страниран", искам да избегна получаването на всички резултати от сървъра и само да "показвам" после тези, които трябва. Това понеже резултатата може да са 10000 записа, а аз да кажем искам да дисплейна само тези от 9000 до 9010.
Заявката е от типа SELECT x FROM t WHERE y, сървъра е SQL2000.
Ще дам повече подробности ако трябва..
Много съм тъп.
Re: Въпрос
SELECt x FROM t WHERE y LIMIT 9000,9010
ako dadesh oste podrobnosti, moje i drugo da se izmisli
ako dadesh oste podrobnosti, moje i drugo da se izmisli
Re: Въпрос
Ako izpolzvash ADO recordset za dostyp do dannite mojesh da polzvash property-tata PageSize, AbsolutePage, PageCount za da stranicirash dannite.
Re: Въпрос
Нема такова чудо като LIMIT? и в хелпа търсих и директно го пробвах- не работи
Re: Въпрос
Благодаря
значи, като използвам това сървъра няма да върне всичките резултати? А само съответната страница?
примерно при open на recordset-a с такава заявка няма да преточи целия резултат, а само първата страница, и да кажем при Моveto 9000-я запис ще презареди само конкретната страница където се намира той?
Притеснява ме че при началния open на recordset-a /преди да съм почнал да се придвижвам в него/, ще чакам един час? Сървъра не е локален така че е важно
Не може ли да се изнесе функционалността в самия сървър, сторед процедура дето да й подавам като параметри от кой до кой запис искам, или нещо такова?
Може ли примерен код... извинявам се за нахалството
значи, като използвам това сървъра няма да върне всичките резултати? А само съответната страница?
примерно при open на recordset-a с такава заявка няма да преточи целия резултат, а само първата страница, и да кажем при Моveto 9000-я запис ще презареди само конкретната страница където се намира той?
Притеснява ме че при началния open на recordset-a /преди да съм почнал да се придвижвам в него/, ще чакам един час? Сървъра не е локален така че е важно
Не може ли да се изнесе функционалността в самия сървър, сторед процедура дето да й подавам като параметри от кой до кой запис искам, или нещо такова?
Може ли примерен код... извинявам се за нахалството
Re: Въпрос
da praw si, twa beshe w mysql-a...
za MSSQL 2000 se polzwashe TOP....
problema s nego e che wrysta samo pyrwite n zapisa (demek ot 1 do n) i ne e tochno kakwoto ti triabwa
za MSSQL 2000 se polzwashe TOP....
problema s nego e che wrysta samo pyrwite n zapisa (demek ot 1 do n) i ne e tochno kakwoto ti triabwa
Re: Въпрос
tochno tova go gledah pisano za Sybase sas stored procedure obache ne pomnia link-a
kato se ima predvid che i dvete pozlvat pochti edin sashti TSQL bi triabvalo da raboti bez problem
problemat e che beshe realizirano s cursor a tova e potencialno bavna operacia
mislia che si na prav pat
potencilana vazmozhnost za zabarzvane na nestata e ako ima sortirane ili primary key da podavash i nego kato parameter kato go vkluchish vav where klauzata taka che da izkluchi predishnite redove
kato se ima predvid che i dvete pozlvat pochti edin sashti TSQL bi triabvalo da raboti bez problem
problemat e che beshe realizirano s cursor a tova e potencialno bavna operacia
mislia che si na prav pat
potencilana vazmozhnost za zabarzvane na nestata e ako ima sortirane ili primary key da podavash i nego kato parameter kato go vkluchish vav where klauzata taka che da izkluchi predishnite redove
Re: Въпрос
Dannite ne se teglqt na klienta. Otavrq se cursor vyrhu zapisite. Toi moje da byde server-side ili klient-side. Vtoriq zaema poveche mqsto na klienta i se otvarq po-bavno no za smetka na tova se raboti p-byrzo s nego. Az sym pravil podobno stranirane - dokolkoto si spomnqm za okolo 60000 zapisa kursora se otvarqshe za okolo 1-2sec ( client-side ) i posle samite danni se fetch-vaha strashno byrzo. Sys server-side cursor-a se otvarqshe vednaga, no za smetka na tova dannite se pretochvaha nedopostimo bavno.
Shto se otnasq do varianta sys stored-procedura ili nqkakyv drug variant na SQL za vsqka stranica - tova osven che shte otnema vreme za izpylnenie na zaqvkata vseki pyt ( pri golqma tablica shte e chuvstvitelno bavno ), osven tova syshtestvuva i problema che dannite mogat da se promenqt mejdu dve straniciraniq. Naprimer ako na stranica 1 imash 3-te reda A, F, M, otivash na stranica 2 i dokato si na neq nqko dobavq red B i kato se vyrnesh na stranica 1 veche vijdash A, B, F. stranica 2 syshto shte se e smenila. Tova ne e chak tolkova vajno v povecheto sluchai no nai-malkoto e neestestveno.
Shto se otnasq do primeren kod - ne moga da ti dam takyv no ne mislq che shte sreshtnesh trudnosti s implementaciqta. Ako polzvash C++ i pokazvash rezultatite v List Control - mojesh da poglednesh virtual list control-a. Toi e izkliuchitelno podhodqsht za podoben vid problem
Shto se otnasq do varianta sys stored-procedura ili nqkakyv drug variant na SQL za vsqka stranica - tova osven che shte otnema vreme za izpylnenie na zaqvkata vseki pyt ( pri golqma tablica shte e chuvstvitelno bavno ), osven tova syshtestvuva i problema che dannite mogat da se promenqt mejdu dve straniciraniq. Naprimer ako na stranica 1 imash 3-te reda A, F, M, otivash na stranica 2 i dokato si na neq nqko dobavq red B i kato se vyrnesh na stranica 1 veche vijdash A, B, F. stranica 2 syshto shte se e smenila. Tova ne e chak tolkova vajno v povecheto sluchai no nai-malkoto e neestestveno.
Shto se otnasq do primeren kod - ne moga da ti dam takyv no ne mislq che shte sreshtnesh trudnosti s implementaciqta. Ako polzvash C++ i pokazvash rezultatite v List Control - mojesh da poglednesh virtual list control-a. Toi e izkliuchitelno podhodqsht za podoben vid problem
Re: Въпрос
nachi warianta twa da stane sys TSQL zaiawka e slednia:
naprimer ako iskash da wzemesh mejdu 40 i 50-ti zapis prawish SELECT sys TOP 50. posle obrystash rezultata otzad napred i prawish TOP 10. Cialata taia hava si ia napiswash w edna stored proc s parametri ot koi do koi zapis iskash rez i niamash nikwi griji
a inache ako ste prawish wryzkata sys c++ izpolzwai cursor-a
naprimer ako iskash da wzemesh mejdu 40 i 50-ti zapis prawish SELECT sys TOP 50. posle obrystash rezultata otzad napred i prawish TOP 10. Cialata taia hava si ia napiswash w edna stored proc s parametri ot koi do koi zapis iskash rez i niamash nikwi griji
a inache ako ste prawish wryzkata sys c++ izpolzwai cursor-a
Re: Въпрос
Относно "странирането" на данни
1. Пример с ADO страниране
2. Пример със Stored procedure на MsSQL Server
3. Transact-SQL server cursor
=====================================
1. Пример с ADO страниране
Това за което Иво говори (PageSize, AbsolutePage, PageCount) такива примери има на:
Database Paged Search
[линк]
Database Paging
[линк]
е вярно примерите са на 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-а, отколкото ако го караме да прави временни таблици. Знае ли човек? :)
1. Пример с ADO страниране
2. Пример със Stored procedure на MsSQL Server
3. Transact-SQL server cursor
=====================================
1. Пример с ADO страниране
Това за което Иво говори (PageSize, AbsolutePage, PageCount) такива примери има на:
Database Paged Search
[линк]
Database Paging
[линк]
е вярно примерите са на 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-а, отколкото ако го караме да прави временни таблици. Знае ли човек? :)
Благодаря !!!
Благодаря, особено на Иво и LQS.
Помогнахте ми наистина, нещата пробачкаха задоволително /с АДО, без сторед процедури/.
Благодаря отново!
Вече не толкова тъп
Помогнахте ми наистина, нещата пробачкаха задоволително /с АДО, без сторед процедури/.
Благодаря отново!
Вече не толкова тъп