Vítejte na blog.vyvojar.cz Přihlásit | Registrovat | Pomoc
Univerzálna stránkovacia uložená procedura

Keďže MS SQL server 2000  nemá priamu podporu pre stránkovanie ako napríklad MySQL ( Oracle je na tom lepšie pretože ma aspoň rownum a niečo podobné by mal mať pripravovaný Yukon ). Táto uložená procedúra vracia dva výsledky:

a)      počet záznamov

b)      recorset s daným počtom riadkov

 

použitie pre výpis v ASP.NET datagride bude v ďaľšom článku ( Stránkovanie v ASP.NET efektívne a výkonne ).

 

Použitie v QA na databázi NorthWind:

 

exec strankovanie 'Orders','OrderID, CustomerID, EmployeeID, OrderDate, RequiredDate, ShippedDate, ShipVia, Freight, ShipName, ShipAddress, ShipCity, ShipRegion, ShipPostalCode, ShipCountry' , 10, 1, 'ShipName', ''

 

definícia SP:

 

 

CREATE PROCEDURE dbo.Strankovanie

(

      @menoTabulky varchar(50),

      @parametre varchar(500),

      @pocetZaznamov int,

      @cisloStranky int,

      @trieditPodla varchar(50),--toto je nutny parameter pre fungovanie strankovnia

      @podmienky varchar(500)

)

AS

      BEGIN

            DECLARE @SQL VARCHAR(2000), @podvyberStranky int

            SET @podvyberStranky    = @cisloStranky * @pocetZaznamov

            -- Spocitanie riadkov vo vysledku

            SET @SQL = 'Select COUNT(*) FROM '+@menoTabulky+''

                        IF ( @podmienky IS NOT NULL AND @podmienky <> '' )

            SET @SQL = @SQL + ' WHERE ' + @podmienky +' '

            execute( @sql)

 

      --Ak nie su zadane ziadne parametre, pouzi vsetky

            --je to vsak urcitu spomalenie pretoze zistenie nazvom stplcom

            --ma tiez urcitu reziu a zbytocne sa tiez prenasaju data, ktore

            --ani nepouzijeme

            IF (@parametre IS NULL OR @parametre ='')

                  SET @parametre = '*'

                 

            --Query pre strankovanie

            SET @SQL = 'Select '+@parametre+' FROM

                  ( SELECT TOP '+CAST(@pocetZaznamov AS VARCHAR(4))+' '+@parametre+' FROM

                        ( SELECT TOP '+CAST(@podvyberStranky AS VARCHAR(4))+' '+@parametre+' FROM '+@menoTabulky+' '

            IF ( @podmienky IS NOT NULL AND @podmienky <> '' )

            SET @SQL = @SQL + ' WHERE ' + @podmienky +' '

            SET @SQL = @SQL +'Order BY '+@trieditPodla+' ASC)

                  t2 ORDER BY '+@trieditPodla+' DESC )

            t ORDER BY '+@trieditPodla+' '

PRINT (@SQL)

execute( @sql)

           

      END

      RETURN

 

Posted: 25. června 2004 15:50 by rasto
Vedeno pod:

Komentář

Michal Neuwirth napsal:

Otazka: Proc ma MySQL strankovani ktere nema napr. Oracle ci MS SQL?

Odpoved: MySQL je ISAM databaze (jako napr. Access ci FoxPro) umoznujici primy pristup k libovlnemu zaznamu v souboru. Kdezto MS SQL ci Oracle je relacni engine, ktery pracuje s daty pomoci stranek, kde primy pristup mozny neni.
# června 28, 2004 9:37

Zerryk napsal:

Má to vadu - pokud sloupec trieditPodla neni unique, neni zaruceno, ze pri sortovani DESC dostaneme presne totez co pri ASC.
# června 29, 2004 14:06

Zerryk napsal:

ad Milan Neuwirth: Když už je tam operátor TOP, úplně stejně dobře tam mohli dát i jiný, stejně fungující, se dvěma int parametry. Tak jako tak, všechny metody stránkování obecných dotazů na MSSQL s nimiž jsem měl tu čest, udělaly nějaký ten TOP a začátek zahodily.
Btw jak interně fungovalo stránkování u ADODB recordsetu?
# června 29, 2004 14:54

Matop napsal:

Len smola ze parameter trieditPodla sa neda prilis pouzit pri mierne zlozitejsej poziadavke. Neviete niekto o nejakej stranke kde by toto strankovanie rozoberali dokladnejsie a boli tam aj ukazky kodov - zauzivane a osvecene? Dik.
# srpna 27, 2004 8:12

Rasto napsal:

To Matop: No napis co presne potrebujes, pokial by si potreboval triedit podla dalsich podmienok nie je predsa problem rozsirit proceduru o dalsi parameter a pridat do kodu triedenie az vyselectovanych dat z TOP FROM TOP. To co tu publikujem je osvedcene priklad najdes na adrese http://sector.aspweb.cz/download/WebPaging1.zip pripadne mozem tento priklad i rozsirit ..... ak bude zaujem ...
# září 7, 2004 10:11

Jano napsal:

Ak mas vela udajov bude snad lepsie pouzit nasledujuci model:
declare MyCursor scroll cursor for
select .....
for read only

open MyCursor
set = @NrVon =@pocetZaznamov*(@cisloStranky-1)
fetch absolute @NrVon from MyCursor into ....

while (@@fetch_status <> -1)
begin
if (@@fetch_status <> -2)
begin
/* Process
.....
*/

select @counter = @counter + 1
if (@counter >= @pocetZaznamov)
begin
-- finito
break
end
end
fetch MyCursor into ...
end
-- Get Total Rows -
fetch last from MyCursor into ...
select @totalrows = @@CURSOR_ROWS

close MyCursor
deallocate MyCursor
# července 7, 2006 8:41
Neregistrovaní uživatele nemužou přidávat komentáře.
Vyvojar.cz na prodej!