2017-08-24 5 views
1

Nous essayons d'implémenter la pagination en coldfusion. Donc, j'ai besoin de faire des changements dans sql query pour récupérer seulement un nombre de données Perticular et en cliquant sur le bouton suivant, le prochain ensemble de données devrait être interrogé.Mise en œuvre de la pagination en coldfusion

SELECT History.*,User.FirstName,User.LastName 
    FROM History 
    LEFT OUTER JOIN User ON History.UserID = User.UserID 
    WHERE History.UserID = <CFQUERYPARAM VALUE="#UserID#" CFSQLTYPE="CF_SQL_INTEGER"> 
    AND Type IS NOT NULL 
    AND SubType IS NOT NULL 
    ORDER BY #OrderBy# #sort# 

Quelqu'un peut-il m'aider à faire la même chose avec la question donnée ci-dessus.

exemple requête:

SELECT * FROM (
     SELECT ROW_NUMBER() OVER(ORDER BY SearchID) AS NUMBER, 
       * FROM search_history 
       WHERE UserID=111 
       AND Date >= #DateVal#  
      ) AS TBL 
    WHERE NUMBER BETWEEN ((#pageNum# - 1) * #MaxRows# + 1) AND (#pageNum# * #MaxRows#) 
    ORDER BY #OrderBy# #sort# 
+0

Attention à l'injection SQL dans votre ORDER BY. Quelles versions de ColdFusion et SQL? – Shawn

Répondre

1

Tout d'abord, il est un problème avec SQL Server et non ColdFusion. Vous générez simplement la requête en ligne avec ColdFusion. Il serait préférable que vous créiez cette requête en tant que procédure stockée, qui, par nature, fonctionnerait mieux qu'une requête en ligne.

Deuxièmement, this answer est la base de l'exemple que je poste. SQL Server n'a malheureusement pas pris en charge OFFSET et LIMIT, ce qui rend la pagination simple. Ceux-ci ont été dans MySQL et postgreSql pour toujours. Troisièmement, à compter de SQL Server 2012, il existe désormais un support pour OFFSET et FETCH (essentiellement LIMIT). Here is a good example de comment cela fonctionne.

Cet exemple utilise SQL @parameters. Idéalement, vous devez les déclarer dans une procédure stockée, mais vous pouvez les déclarer et les définir dans votre requête en ligne. Assurez-vous simplement d'utiliser cfqueryparam pour se protéger contre les attaques SQL Injection.

SELECT * 
FROM (
    SELECT 
     h.column1 
     , h.column2 
     , u.FirstName 
     , u.LastName 
     , SELECT ROW_NUMBER() OVER (ORDER BY @ORDER_BY @SORT_ORDER) AS RowNum 
    FROM 
     dbo.History h 
    INNER JOIN 
     dbo.User u ON h.UserID = u.UserID 
    WHERE 
     h.UserID = @USER_ID 
     AND 
     h.Type IS NOT NULL 
     AND 
     h.SubType IS NOT NULL 
) AS HistorySearch 
WHERE 
    RowNum >= @ROW_START 
    AND 
    RowNum < @ROW_END 
ORDER BY 
    RowNum 
Vous devez calculer les valeurs ROW_START et ROW_END en fonction du numéro de page et d'une variable de taille de page.

Enfin, n'utilisez pas SELECT * dans votre requête de sélection principale. C'est une mauvaise pratique.

0

Selon la quantité de données que vous renvoyez, vous pouvez effectuer votre requête normalement et effectuer une pagination sur la sortie avec fusion à froid. Et si vous pouvez éviter d'utiliser * dans la requête, c'est une bonne idée.

<cfparam name="StartAt" default="1"> 
<cfparam name="MaxRows" default="100"> 

<cfoutput name="QueryName" startrow="#StartAt#" maxrows="#maxRows#" > 

Les variables MaxRows et StartAt seraient fixés dans votre forme, et transmis lorsque l'utilisateur clique suivant ou précédent.

Si vous avez un jeu de résultats très volumineux, limiter les données renvoyées serait une meilleure idée que vous avez avancée.

+0

Le résultat de la requête est très volumineux et plante l'application entre les deux. de sorte que seulement nous avons commencé à penser à l'alternative. –