我应该在SQL Server中创建一个查询,我只请求最大数量的记录,例如2000。 我使用的查询是
SELECT *
FROM [AlarmsHistory]
WHERE (DATEPART (year, StartTime) = {0})
AND (DATEPART (month, StartTime) = {1})
AND (DATEPART (day, StartTime) = {2} )
其中{0}
我放了年份,{1}
我把月份和{2}
我放了一天。
我可能从0也记录多达5000条记录。
我想要的是最多只能在表格中显示2000条记录。
答案 0 :(得分:3)
如果它是永久值,您可以使用TOP 2000。不要忘记ORDER BY来指定要显示的记录的优先级。
SELECT TOP 2000 *
FROM [AlarmsHistory]
WHERE (DATEPART (year, StartTime) = {0})
AND (DATEPART (month, StartTime) = {1})
AND (DATEPART (day, StartTime) = {2} )
ORDER BY StartTime DESC -- don't forget about an order, it matters for TOP
查询页码等于1的分页:
DECLARE @PageSize INT = 2000;
DECLARE @PageNumber INT = 1;
SELECT *
FROM [AlarmsHistory]
WHERE (DATEPART (year, StartTime) = {0})
AND (DATEPART (month, StartTime) = {1})
AND (DATEPART (day, StartTime) = {2} )
ORDER BY StartTime DESC
OFFSET @PageSize * (@PageNumber - 1) ROWS
FETCH NEXT @PageSize ROWS ONLY;
在此处阅读有关OFFSET / FETCH的更多信息:https://sqlperformance.com/2015/01/t-sql-queries/pagination-with-offset-fetch
没有OFFSET
/ FETCH NEXT
,因此请使用CTE和ROW_NUMBER() OVER(ORDER BY ...)
为结果集中的每一行提供RowNumber
,然后查询必要的范围。此方法也用于旧版SLQ Server中的分页,因此我使用@PageSize
和@PageNumber
变量来显示通用解决方案。你绝对可以缩短它。
DECLARE @PageSize INT = 2000;
DECLARE @PageNumber INT = 1;
WITH NumberedRows AS
(
SELECT
ROW_NUMBER() OVER(ORDER BY StartTime DESC) AS RowNumber,
*
WHERE DATEPART(year, StartTime) = {0}
AND DATEPART(month, StartTime) = {1}
AND DATEPART(day, StartTime) = {2}
FROM [AlarmsHistory]
)
SELECT *
FROM NumberedRows
WHERE RowNumber
BETWEEN @PageSize * (@PageNumber - 1) + 1
AND @PageSize * @PageNumber
答案 1 :(得分:1)
试试这个:
SELECT TOP 2000 *
FROM [AlarmsHistory]
WHERE (DATEPART (year, StartTime) = {0})
AND (DATEPART (month, StartTime) = {1})
AND (DATEPART (day, StartTime) = {2} )
ORDER BY StartTime
使用TOP,您可以指出查询结果的最大记录限制。
希望得到这个帮助。