Sql server 返回MS SQL Server中数据子集旁边的总记录计数
我有一个相当标准的查询,当我想在MS SQL中获取数据的子集时,可以使用它来分页记录 我想做的是在同一个查询中尽可能高效地返回一个总记录计数 还有一些其他问题可以解决这个问题,基本上是在返回所需子集之前,在使用Sql server 返回MS SQL Server中数据子集旁边的总记录计数,sql-server,sql-server-2008,pagination,Sql Server,Sql Server 2008,Pagination,我有一个相当标准的查询,当我想在MS SQL中获取数据的子集时,可以使用它来分页记录 我想做的是在同一个查询中尽可能高效地返回一个总记录计数 还有一些其他问题可以解决这个问题,基本上是在返回所需子集之前,在使用ROW_NUMBER()时获取记录总数 这些解决方案似乎对我不起作用,尤其是因为在这种情况下,我使用的是一个视图,而且如果不先指定TOP值,我似乎无法使用ROW\u NUMBER();因此,总行数仅由子集组成 如果我在SQLServer2008中的视图上运行以下代码,有人能建议一种返回总计
ROW_NUMBER()
时获取记录总数
这些解决方案似乎对我不起作用,尤其是因为在这种情况下,我使用的是一个视图,而且如果不先指定TOP
值,我似乎无法使用ROW\u NUMBER()
;因此,总行数仅由子集组成
如果我在SQLServer2008中的视图上运行以下代码,有人能建议一种返回总计数的方法吗
DECLARE
@PageSize INT = 10
, @CurrentPage INT = 1
;
WITH o AS
(
SELECT TOP (@CurrentPage * @PageSize)
[RowNumber] = ROW_NUMBER () OVER (ORDER BY [t_YourTable].[IndexedField] DESC )
, [t_YourTable].[Field1]
, [t_YourTable].[Field2]
, [t_YourTable].[Field3]
, [t_YourTable].[Field4]
, [t_YourTable].[IndexedField]
FROM [t_YourTable]
ORDER BY
[t_YourTable].[IndexedField] DESC
)
SELECT
[Field1]
, [Field2]
, [Field3]
, [Field4]
, [IndexedField]
FROM o
WHERE
[RowNumber] BETWEEN (( @CurrentPage - 1 ) * @PageSize + 1 )
AND ((( @CurrentPage - 1 ) * @PageSize) + @PageSize)
ORDER BY
[RowNumber]
如果我能够去掉
TOP
语句,我假设我可以简单地计算RowNumber
字段,并将其作为结果集的一部分返回-但是SQL Server说我不能在视图上执行此操作。似乎我可以使用TOP(100)
实现此功能,这样我就可以计算子选择中的行数。我不确定这有多有效,所以我希望得到任何反馈
我的代码变成:
DECLARE
@PageSize INT = 10
, @CurrentPage INT = 1
;
WITH o AS
(
SELECT TOP 100 PERCENT
[RowNumber] = ROW_NUMBER () OVER (ORDER BY [t_YourTable].[IndexedField] DESC )
, [t_YourTable].[Field1]
, [t_YourTable].[Field2]
, [t_YourTable].[Field3]
, [t_YourTable].[Field4]
, [t_YourTable].[IndexedField]
FROM [t_YourTable]
ORDER BY
[t_YourTable].[IndexedField] DESC
)
SELECT (SELECT COUNT(*) FROM o) AS TotalRows
, [Field1]
, [Field2]
, [Field3]
, [Field4]
, [IndexedField]
FROM o
WHERE
[RowNumber] BETWEEN (( @CurrentPage - 1 ) * @PageSize + 1 )
AND ((( @CurrentPage - 1 ) * @PageSize) + @PageSize)
ORDER BY
[RowNumber]
我认为如果在视图中使用ORDER BY,SQL会给您一个错误,如果您指定TOP,则可以避免该错误。这是正确的-在我的示例中指定了TOP,但是这意味着我无法返回基于条件的总记录计数。。。除非我人为地将TOP值设置得非常高——但这感觉真的有点像黑客。你可以删除TOP和ORDER BY,并使用ROW_NUMBER进行分页,正如你在问题中所说的那样。这行得通吗?当然,这意味着您需要更改客户端应用程序。如果我这样做,我不确定我是否能够对记录进行排序。您可以按[Rownumber]排序,但如果我理解正确,您需要在使用此视图和分页的应用程序中进行排序。