在coldfusion实施分页

时间:2017-08-24 15:06:42

标签: sql sql-server pagination coldfusion

我们正在尝试在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#

2 个答案:

答案 0 :(得分:2)

首先,这是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 *。这是一个不好的做法。

答案 1 :(得分:0)

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

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

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

变量MaxRows和StartAt将在您的表单中设置,并在用户单击“下一个”或“上一个”时传递。

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