【问题标题】:Implementation of pagination in coldfusion冷融合中分页的实现
【发布时间】:2017-08-24 15:06:42
【问题描述】:

我们正在尝试在coldfusion中实现分页。所以我需要在sql查询中进行更改以仅获取特定数量的数据,并且在单击下一步按钮时,应该查询下一组数据。

  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#

谁能帮我对上面给出的查询做同样的事情。

示例查询:

   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#

【问题讨论】:

  • 注意 ORDER BY 中的 SQL 注入。 ColdFusion 和 SQL 有哪些版本?

标签: sql sql-server pagination coldfusion


【解决方案1】:

首先,这是 SQL Server 的问题,而不是 ColdFusion 的问题。您只是使用 ColdFusion 生成内联查询。如果将此查询创建为存储过程会更好,它本质上会比内联查询执行得更好。

其次,this answer 是我发布的示例的基础。众所周知,SQL Server 不支持OFFSETLIMIT,这使得分页变得非常简单。这些一直存在于 MySQL 和 postgreSql 中。

第三,从 SQL Server 2012 开始,现在支持 OFFSETFETCH(本质上是 LIMIT)。 Here is a good example 这是如何工作的。

此示例使用 SQL @parameters。理想情况下,您会在存储过程中声明这些,但您可以在内联查询中声明和设置它们。只要确保使用cfqueryparam 来防止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
您需要根据页码和页面大小变量计算ROW_STARTROW_END 的值。

最后,不要在主选择查询中使用SELECT *。这是一个不好的做法。

【讨论】:

    【解决方案2】:

    根据您返回的数据量,您可以正常进行查询并使用冷融合对输出进行分页。如果您可以避免在查询中使用 *,那是个好主意。

    <cfparam name="StartAt" default="1">
    <cfparam name="MaxRows" default="100">
    
    <cfoutput name="QueryName" startrow="#StartAt#" maxrows="#maxRows#" > 
    

    变量 MaxRows 和 StartAt 将在您的表单中设置,并在用户单击 Next 或 previous 时传递。

    如果您有一个非常大的结果集,那么限制返回的数据将是您提出的更好的主意。

    【讨论】:

    • 查询结果非常大,导致应用程序崩溃。所以只有我们开始考虑替代方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多