2011-09-18 1 views
-2

À l'heure actuelle, le code est (pour simplifier les choses, je n'ai pas encore utilisé l'objet de commande ADO pour empêcher l'injection SQL).Nécessité de convertir la procédure de pagination stockée pour les grands ensembles de données à l'aide de SQL Server 2005

J'ai un grand ensemble de données. J'utilise la méthode getrows qui est géniale pour récupérer les jeux d'enregistrements. Je ne peux pas trouver une procédure stockée similaire pour récupérer des enregistrements en fonction de la page que vous possédez dans le navigateur.

Fondamentalement, le sql récupère 10 jeux d'enregistrements par rapport à la page sur laquelle le navigateur clients est activé. Il obtient la valeur de la page à partir de la valeur CurrPage. Je gère la première page et la dernière page avec le code côté serveur afin qu'il n'y ait pas d'erreurs.

Toute aide est appréciée.

If IsEmpty(Request.Querystring("pg")) then 
CurrPage = 1 
Else 
CurrPage = Cint(Request.Querystring("pg")) 
End If 

RSPrevPage = CurrPage -1 
RSNextPage = CurrPage + 1 

SQL = "SELECT gallerypublic.img, gallerypublic.galleryID, blahblahblah FROM gallerypublic INNER JOIN GalleryPublicCat ON gallerypublic.publicgallerycatid = GalleryPublicCat.pubcatID INNER JOIN userbase ON gallerypublic.userid = userbase.userid Order by galleryid desc" 

Set rsFeed = Server.CreateObject("ADODB.Recordset") 
rsFeed.Open sql, Conn, adOpenKeyset, adLockReadOnly 
rsFeed.PageSize = 10 
rsFeed.AbsolutePage = CurrPage 
arrFeed = rsFeed.getrows(10) 
intPageCount = rsFeed.PageCount 
rsFeed.close 
set rsFeed = Nothing 

Je trouve cette procédure stockée sur http://www.aspfaqs.com/webtech/042606-1.shtml mais je ne peux pas le traduire à mes besoins.

TIA

Après un petit essai et erreur, voici le code de travail:

côté serveur:

If IsEmpty(Request.Querystring("pg")) then 
    CurrPage = 1 
    Else 
    CurrPage = Cint(Request.Querystring("pg")) 
    End If 

    RSPrevPage = CurrPage -1 
    RSNextPage = CurrPage + 1 

    pgSize = 10 

    Set objCommandSec = CreateObject("ADODB.Command") 
    objCommandSec.ActiveConnection = Conn 

    With objCommandSec 
    Set .ActiveConnection = Conn 
    .CommandType = adCmdStoredProc 
    .CommandText = "spPageDef" 
    .Parameters.Append .CreateParameter("@PageNum", 200, 1, 255, CurrPage) 
    .Parameters.Append .CreateParameter("@PageSize", 200, 1, 255, pgSize) 
    .Parameters.Append .CreateParameter("@TotalRowsNum", adInteger, adParamReturnValue) 

    Set rsFeed = objCommandSec.Execute 
    arrFeed = rsFeed.getrows() 
    rsFeed.close 
    set rsFeed = nothing 

    intPageCount = cLng((.Parameters(2).value/pgSize)) 

    End With 

procédure stockée:

@PageNum int, 
    @PageSize int, 
    @TotalRowsNum int output 

    BEGIN 
     -- SET NOCOUNT ON added to prevent extra result sets from 

     -- interfering with SELECT statements. 

     SET NOCOUNT ON; 

     -- Use ROW_NUMBER function 

     WITH DefaultEntries As 
     (
      SELECT 
g.img, g.galleryID, g.viewed, g.votes, g.rate, g.created, blahblah, 
'RowNumber' = ROW_NUMBER() OVER(ORDER BY galleryid DESC) 

     FROM gallerypublic AS g INNER JOIN GalleryPublicCat AS gpc ON g.publicgallerycatid = gpc.pubcatID INNER JOIN userbase AS u ON g.userid = u.userid 
     ) 

     -- Query result 

     SELECT * 
     FROM DefaultEntries 
     WHERE RowNumber BETWEEN (@PageNum - 1) * @PageSize + 1 AND @PageNum * @PageSize    
     ORDER BY galleryid DESC 

    SELECT @TotalRowsNum = count(galleryid) 
    FROM gallerypublic AS g INNER JOIN GalleryPublicCat AS gpc ON g.publicgallerycatid = gpc.pubcatID INNER JOIN userbase AS u ON g.userid = u.userid 

    END 

Merci à tous ceux qui ont aidé et m'a pointé dans la bonne direction

+2

Il helo si vous décrivez comment vous pourriez ne pas traduire le code à vos besoins. Aussi, s'il vous plaît voir cet article de SSC http://www.sqlservercentral.com/articles/T-SQL/66030/ et la conversation de suivi (comme plus de valeur) http://www.sqlservercentral.com/Forums/Topic672980 -329-1.aspx –

Répondre

0

procédure stockée

@PageNum int, 
    @PageSize int, 
    @TotalRowsNum int output 

    BEGIN 
     -- SET NOCOUNT ON added to prevent extra result sets from 

     -- interfering with SELECT statements. 

     SET NOCOUNT ON; 

     -- Use ROW_NUMBER function 

     WITH DefaultEntries As 
     (
      SELECT 
g.img, g.galleryID, g.viewed, g.votes, g.rate, g.created, blahblah, 
'RowNumber' = ROW_NUMBER() OVER(ORDER BY galleryid DESC) 

     FROM gallerypublic AS g INNER JOIN GalleryPublicCat AS gpc ON g.publicgallerycatid = gpc.pubcatID INNER JOIN userbase AS u ON g.userid = u.userid 
     ) 

     -- Query result 

     SELECT * 
     FROM DefaultEntries 
     WHERE RowNumber BETWEEN (@PageNum - 1) * @PageSize + 1 AND @PageNum * @PageSize    
     ORDER BY galleryid DESC 

    SELECT @TotalRowsNum = count(galleryid) 
    FROM gallerypublic AS g INNER JOIN GalleryPublicCat AS gpc ON g.publicgallerycatid = gpc.pubcatID INNER JOIN userbase AS u ON g.userid = u.userid 

    END 

côté serveur

If IsEmpty(Request.Querystring("pg")) then 
CurrPage = 1 
Else 
CurrPage = Cint(Request.Querystring("pg")) 
End If 

RSPrevPage = CurrPage -1 
RSNextPage = CurrPage + 1 

pgSize = 10 

Set objCommandSec = CreateObject("ADODB.Command") 
objCommandSec.ActiveConnection = Conn 

With objCommandSec 
Set .ActiveConnection = Conn 
.CommandType = adCmdStoredProc 
.CommandText = "spPageDef" 
.Parameters.Append .CreateParameter("@PageNum", 200, 1, 255, CurrPage) 
.Parameters.Append .CreateParameter("@PageSize", 200, 1, 255, pgSize) 
.Parameters.Append .CreateParameter("@TotalRowsNum", adInteger, adParamReturnValue) 

Set rsFeed = objCommandSec.Execute 
arrFeed = rsFeed.getrows() 
rsFeed.close 
set rsFeed = nothing 

intPageCount = cLng((.Parameters(2).value/pgSize)) 

End With 
0

Semble que vous voulez que votre logique de pagination dans votre proc stocké. Il semble que vous utilisiez SQL Server 2005. Suggérer l'utilisation d'un CTE pour implémenter votre pagination et abandonner votre implémentation ADO. Proposer quelque chose comme ceci:

CREATE PROC  GetMyData 
@PageSize INT, 
@PageNumber INT, 
@FirstRow INT 
AS 
DECLARE @LastRow INT; 

SELECT @FirstRow = (@PageNumber - 1) * @PageSize + 1, 
      @LastRow = (@PageNumber - 1) * @PageSize + @PageSize; 

WITH MySet AS 
(
    SELECT ROW_NUMBER() OVER 
       (ORDER BY galleryid DESC) AS RowNumber, 
      g.img, 
      g.galleryID, 
      etc 
    FROM gallerypublic as g 
    INNER JOIN GalleryPublicCat AS gpc ON g.publicgallerycatid = gpc.pubcatID 
    INNER JOIN userbase AS u ON g.userid = u.userid 
) 
SELECT RowNumber, 
     img, galleryid, etc 
FROM MySet 
WHERE RowNumber BETWEEN @FirstRow AND @LastRow 
ORDER BY RowNumber ASC; 
+0

merci pour le code. Tu m'as définitivement orienté dans la bonne direction. Votre code a couru sous sql server a pris 8339 ms. Le code que j'ai ajouté à ma question initiale ne prend que 243 ms. Merci encore. – Patriotec

Questions connexes