我有一个存储过程,目前正在做这样的事情
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
可能是一个选项。但是我们只想返回一页的行。