我们正在尝试在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#
答案 0 :(得分:2)
首先,这是SQL Server而不是ColdFusion的问题。您只是使用ColdFusion内联生成查询。如果您将此查询创建为存储过程会更好,这本质上比内联查询更好。
其次,this answer是我发布的示例的基础。 SQL Server着名的不支持OFFSET
和LIMIT
,这使得分页变得简单。这些已经永远存在于MySQL和postgreSql中。
第三,从SQL Server 2012开始,现在支持OFFSET
和FETCH
(基本上是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_START
和ROW_END
的值。
最后,请勿在主选择查询中使用SELECT *
。这是一个不好的做法。
答案 1 :(得分:0)
根据您返回的数据量,您可以正常进行查询,并使用冷融合对输出进行分页。如果你可以避免在查询中使用*是一个好主意。
<cfparam name="StartAt" default="1">
<cfparam name="MaxRows" default="100">
<cfoutput name="QueryName" startrow="#StartAt#" maxrows="#maxRows#" >
变量MaxRows和StartAt将在您的表单中设置,并在用户单击“下一个”或“上一个”时传递。
如果你有一个非常大的结果集,那么限制返回的数据将是你提出的更好的主意。