Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 返回MS SQL Server中数据子集旁边的总记录计数_Sql Server_Sql Server 2008_Pagination - Fatal编程技术网

Sql server 返回MS SQL Server中数据子集旁边的总记录计数

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中的视图上运行以下代码,有人能建议一种返回总计

我有一个相当标准的查询,当我想在MS SQL中获取数据的子集时,可以使用它来分页记录

我想做的是在同一个查询中尽可能高效地返回一个总记录计数

还有一些其他问题可以解决这个问题,基本上是在返回所需子集之前,在使用
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]排序,但如果我理解正确,您需要在使用此视图和分页的应用程序中进行排序。