Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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
MSSQL 2008 SP分页和计数总记录数_Sql_Sql Server_Sql Server 2008_Stored Procedures - Fatal编程技术网

MSSQL 2008 SP分页和计数总记录数

MSSQL 2008 SP分页和计数总记录数,sql,sql-server,sql-server-2008,stored-procedures,Sql,Sql Server,Sql Server 2008,Stored Procedures,在我的SP中,我有以下内容: with Paging(RowNo, ID, Name, TotalOccurrences) as ( ROW_NUMBER() over (order by TotalOccurrences desc) as RowNo, V.ID, V.Name, R.TotalOccurrences FROM dbo.Videos V INNER JOIN .... ) SELECT * FROM Paging WHERE RowNo BETWEEN 1 and

在我的SP中,我有以下内容:

with Paging(RowNo, ID, Name, TotalOccurrences) as 
(
    ROW_NUMBER() over (order by TotalOccurrences desc) as RowNo, V.ID, V.Name, R.TotalOccurrences FROM dbo.Videos V INNER JOIN .... 
)
SELECT * FROM Paging WHERE RowNo BETWEEN 1 and 50
SELECT COUNT(*) FROM Paging
结果是我得到了错误:无效的对象名“Paging”。 我可以再次查询分页表吗?我不想将所有结果的计数包含为一个新列。。。我更愿意作为另一个数据集返回。可能吗


谢谢,Radu

在CTE表格名称页面后面写AS,如下所示: 分页为RowNo、ID、Name、totalOccurrencess为 按TotalOccurrencess排序的行号描述为行号、V.ID、V.Name、R.TotalOccurrencess FROM dbo.Videos V internal JOIN。。。。 从分页中选择*,其中RowNo介于1和50之间
从分页中选择COUNT*,在CTE表格名称分页后写入,如下所示: 分页为RowNo、ID、Name、totalOccurrencess为 按TotalOccurrencess排序的行号描述为行号、V.ID、V.Name、R.TotalOccurrencess FROM dbo.Videos V internal JOIN。。。。 从分页中选择*,其中RowNo介于1和50之间
从分页中选择COUNT*

您不能这样做,因为您正在定义的CTE仅对定义后出现的第一个查询可用。因此,当您运行COUNT*查询时,CTE不再可供引用。这只是CTE的一个限制

因此,要将计数作为一个单独的步骤进行,您不需要使用CTE,而需要使用完整的查询进行计数。 或者,您可以将CTE封装在一个内联表值函数中,并使用该函数来避免重复主查询,如下所示:

CREATE FUNCTION dbo.ufnExample() 
    RETURNS TABLE
AS
RETURN
(
with Paging(RowNo, ID, Name, TotalOccurrences) as 
(
    ROW_NUMBER() over (order by TotalOccurrences desc) as RowNo, V.ID, V.Name, R.TotalOccurrences FROM dbo.Videos V INNER JOIN .... 
)
SELECT * FROM Paging
)

SELECT * FROM dbo.ufnExample() x WHERE RowNo BETWEEN 1 AND 50
SELECT COUNT(*) FROM dbo.ufnExample() x

您不能这样做,因为您正在定义的CTE仅对定义后出现的第一个查询可用。因此,当您运行COUNT*查询时,CTE不再可供引用。这只是CTE的一个限制

因此,要将计数作为一个单独的步骤进行,您不需要使用CTE,而需要使用完整的查询进行计数。 或者,您可以将CTE封装在一个内联表值函数中,并使用该函数来避免重复主查询,如下所示:

CREATE FUNCTION dbo.ufnExample() 
    RETURNS TABLE
AS
RETURN
(
with Paging(RowNo, ID, Name, TotalOccurrences) as 
(
    ROW_NUMBER() over (order by TotalOccurrences desc) as RowNo, V.ID, V.Name, R.TotalOccurrences FROM dbo.Videos V INNER JOIN .... 
)
SELECT * FROM Paging
)

SELECT * FROM dbo.ufnExample() x WHERE RowNo BETWEEN 1 AND 50
SELECT COUNT(*) FROM dbo.ufnExample() x

经过更多的研究,我喜欢另一种方法:

with Paging(RowNo, ID, Name, TotalOccurrences) AS
(
    ROW_NUMBER() over (order by TotalOccurrences desc) as RowNo, V.ID, V.Name,    R.TotalOccurrences FROM dbo.Videos V INNER JOIN .... 
)
select  RowNo, ID, Name, TotalOccurrences, (select COUNT(*) from Paging) as TotalResults  from Paging where RowNo between (@PageNumber - 1 )* @PageSize + 1 and @PageNumber * @PageSize;

我认为这比两次调用查询有更好的性能

经过更多的研究,我喜欢另一种方法:

with Paging(RowNo, ID, Name, TotalOccurrences) AS
(
    ROW_NUMBER() over (order by TotalOccurrences desc) as RowNo, V.ID, V.Name,    R.TotalOccurrences FROM dbo.Videos V INNER JOIN .... 
)
select  RowNo, ID, Name, TotalOccurrences, (select COUNT(*) from Paging) as TotalResults  from Paging where RowNo between (@PageNumber - 1 )* @PageSize + 1 and @PageNumber * @PageSize;

我认为这比两次调用查询有更好的性能

请注意,Radu D的解决方案的查询计划显示对这些表的双击。它在幕后执行了两次死刑。然而,这仍然可能是最好的方法,因为我还没有找到一个真正可伸缩的单查询设计


可伸缩性较差的单查询设计是将已完成的有序列表转储到@tablevariable中,选择@ROWCOUNT以获得完整计数,然后从@tablevariable中选择,其中行数在X和Y之间。这对于非常有效。请注意,Radu D的解决方案的查询计划显示了对这些表的双击。它在幕后执行了两次死刑。然而,这仍然可能是最好的方法,因为我还没有找到一个真正可伸缩的单查询设计


可伸缩性较差的单查询设计是将已完成的有序列表转储到@tablevariable中,选择@ROWCOUNT获取完整计数,然后从@tablevariable中进行选择,其中行数在X和Y之间。这很有效,因为这不是最快的,我现在花了很多时间在这方面。最快的解决方案是获得一个RowNo,以及一个反向RowNo,然后通过执行TotalRecords=RowNo+ReverseRowNo-1来计算总数。在一个大的数据集上尝试它-巨大的改进。这不是最快的,我现在花了很多时间在这上面。最快的解决方案是获得一个RowNo,以及一个反向RowNo,然后通过执行TotalRecords=RowNo+ReverseRowNo-1来计算总数。在一个大数据集上试试——这是一个巨大的改进。避免使用临时表或表变量来快速查询大数据集。您仍然可以在不必使用临时表的情况下获得总计数,请参阅我的其他注释。避免使用临时表或表变量快速查询大型数据集。您仍然可以在不必做临时表的情况下获得TotCount,请参阅我的其他注释。