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

Keďže predchádzajúca verzia stránkovacej procedúra obsahovala jeden neduh (chybičku), keď na poslednej stranke zobrazila rovnaký počet riadkov, musel som to opraviť. Mal som taký malý problém ako vytiahnuť hodnoru počtu záznamov zo skriptu postenného cez EXECUTE, čo som nakoniec vyriešil cez TEMP TABLE....ak niekoho napadne lepší spôsob, budem len rád ak ma o tom bude informovať...

Opravený kód procedúry:

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 bigint

            DECLARE     @cmd VARCHAR(1000), @ExecError INT

            --vytvorenie temp tabulky pre ulozenie poctu zaznamov na stranku

            CREATE TABLE #TempPocet (pocet INT)

            SELECT @podvyberStranky = (@cisloStranky * @pocetZaznamov)

            -- Spocitanie riadkov vo vysledku

            SET @SQL = 'Declare @pocet int,@lPg int,@maxRows int Select @pocet=COUNT(*) FROM '+@menoTabulky+''

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

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

            SET @SQL = @SQL + ' Select @pocet as pocet '

            SET @SQL = @SQL + ' IF ( @pocet%'+CAST(@pocetZaznamov as VARCHAR(20))+' = 0 )

 SELECT @lPg = (@pocet/'+CAST(@pocetZaznamov as VARCHAR(20))+') ELSE

 SELECT @lPg = (@pocet/'+CAST(@pocetZaznamov as VARCHAR(20))+') +1

IF (@lPg ='+CAST(@cisloStranky as VARCHAR(20))+') Select @maxRows = (@pocet%'+CAST(@pocetZaznamov as VARCHAR(20))+')

ELSE Select @maxRows ='+CAST(@pocetZaznamov as VARCHAR(20))+' INSERT INTO #TempPocet (pocet) VALUES (@maxRows)'

            --print @sql

            execute( @sql)

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

                  SET @parametre = '*'

                  SELECT @pocetZaznamov = pocet FROM #TempPocet

            --Query pre strankovanie

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

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

                        ( SELECT TOP '+CAST(@podvyberStranky AS VARCHAR(50))+' '+@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: 30. července 2004 14:46 by rasto
Vedeno pod:

Komentář

B. Stanik T. napsal:

Na jméno tabulky bych nedával varchar(50) ale sysname - tedy navarchar.
# srpna 2, 2004 9:29

Michal Levy napsal:

Lepsi zpusob je pouzit misto EXECUTE, storovanou proceduru sp_executesql, ktera podporuje vstupni a dokonce i vystupni parametry (nedokumentovano). Viz priklad:

DECLARE @Exists tinyint -- vystupni promenna
DECLARE @IntVariable int

DECLARE @SQLString NVARCHAR(500)
DECLARE @ParmDefinition NVARCHAR(500)

/* Build the SQL string once.*/
SET @SQLString =
N'IF EXISTS (SELECT ID_HOUSE FROM Pooling.dbo.HOUSE_BASE WHERE ID_HOUSE = @id) SET @Exists = 1'
SET @ParmDefinition = N'@Exists tinyint OUT, @id int'
/* Execute the string with the first parameter value. */
SET @IntVariable = 10
SET @Exists = 0
EXECUTE sp_executesql @SQLString, @ParmDefinition, @Exists OUT, @id = @IntVariable
SELECT @Exists
/* Execute the same string with the second parameter value. */
SET @IntVariable = 1035
SET @Exists = 0
EXECUTE sp_executesql @SQLString, @ParmDefinition, @Exists OUT, @id = @IntVariable
SELECT @Exists

HTH
# srpna 2, 2004 11:46

Petr Felzmann napsal:

Co nejak takto, bez temp tabulky (pseudokod):

int pageIndex;

DataGrid dg;
dg.VirtualItemCount = select count(1) from MyTable;

int endRow = dg.PageSize * (pageIndex + 1);
int pageSize = endRow > dg.VirtualItemCount
? dg.VirtualItemCount % dg.PageSize : dg.PageSize;

select * from
(select top pageSize * from
(select top endRow * from MyTable order by id asc) t2
order by id desc) t
order by id
# listopadu 23, 2004 10:46

DDT napsal:

Co v pripade, ze se zakladni dotaz nevejde do varchar(8000) - jak to resit.
Nemohu totiz do varchar(8000) ulozit delsi text nez 8000 znaku.

No a SELECT TOP @top....
zas nefunguje.
# července 11, 2005 13:20

Rasto napsal:

Staci si spravit VIEW a to pouzit v hlavnom dotaze ...
# července 12, 2005 23:52
Neregistrovaní uživatele nemužou přidávat komentáře.
Vyvojar.cz na prodej!