来自大型查询的SELECT计数,来自分页子集的行

时间:2017-11-14 16:53:01

标签: sql-server tsql

我有一个存储过程,目前正在做这样的事情

 CREATE TABLE #results (col1 varchar(10), col2 varchar(10), col3 varchar(10), MaxRows BigInt)

 WITH Result AS (
     -- very complex query, lots of filters based on proc parameters
     SELECT Col1, Col2, Col3 
     FROM BaseTable
 , TempCount AS (
     SELECT Count(*) AS MaxRows FROM Result
 )
 INSERT INTO #results (Col1, Col2, Col3, MaxRows)
 SELECT Col1, Col2, Col3
 FROM Result
 OFFSET @pagenumber * @pagesize  ROWS FETCH NEXT @pagesize ROWS ONLY;

 SELECT Col1, Col2, Col3 FROM #results;

 RETURN (SELECT TOP 1 MaxRows FROM #results);

希望返回@pagesize行,而不是更多,但要使过程返回值为复杂选择中的总行数。 @pagesize是存储过程的参数,@pagenumber也是。

为了增加一些具体性,实际查询从订单表中选择行以用于填充网页上的网格。客户很可能有数百或数千个订单。将所有这些行返回给应用程序将是浪费的,因为应用程序一次只能显示一个页面。但是应用程序需要知道有多少订单可用,因此它可以在网格底部放置适当数量的“下一页”链接。

我们能想到的唯一方法是使用临时表。我们将单页结果插入到临时表中,同时还将结果的完整计数计入MaxRows列。然后,一旦它在临时表中,我们可以选择临时表中的行作为结果集,并将MaxRows列作为过程返回值。

有没有办法在没有临时表的情况下执行此操作?如果我们返回完整的结果集,那么我知道@@ROWCOUNT可能是一个选项。但是我们只想返回一页的行。

0 个答案:

没有答案