Sql Server中的最大记录数

时间:2017-03-15 13:37:00

标签: sql sql-server

我应该在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条记录。

2 个答案:

答案 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

如果值变化(从SQL Server 2012开始)

查询页码等于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

如果值不同(服务器版本低于SQL Server 2012)

没有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,您可以指出查询结果的最大记录限制。

希望得到这个帮助。