0

希望这很简单。我正在优化一个返回大约 500 多行的存储过程。我的计划是分批返回这些行,直到没有更多的行可以获取。

例如,我会得到 0-49 行——然后是 50-99,然后是 100-149,等等。

我已经使用以下 SQL 代码完成了这项工作:

CREATE PROCEDURE [dbo].[mySP]  
@rowstart int,
@rowend int   

AS  

WITH MainQuery AS

(
  HUGE SELECT STATEMENT HERE
)

select * from MainQuery where row between @rowstart and @rowend

当我执行这个 SP 时,我只需传入 rowstart 和 rowend 的值,它就会返回我想要的完美行的范围。

问题是,我想知道在每个查询之后有更多的行要获取。我想我可以通过在 MainQuery 块完成后返回@@ROWCOUNT来实现这一点,但我不知道如何在每次执行 SP 后获取返回的行范围和 @@ROWCOUNT 的值。

当我进行返回 50 行的初始查询时,如果我知道有 503 个 TOTAL 表行,我可以做一些简单的数学运算 (503/50) 并计算出我还需要调用多少次 SP。任何帮助表示赞赏!

4

3 回答 3

1

您是否尝试过输出参数?

http://msdn.microsoft.com/en-us/library/ms378108%28v=sql.90%29.aspx

于 2011-01-12T00:16:52.580 回答
0

其他答案将告诉您如何从存储过程中获取答案...

我想指出的@@ROWCOUNT@rowend - @rowstart + 1。所以,除了最后一页,你有 50 行。对于最后一页,您可以从数据表中获取客户端中的行数。

如果你想从 SQL 中得到它,你需要的是这样的东西

WITH MainQuery AS
    (
  HUGE SELECT STATEMENT HERE
)
select * from MainQuery
CROSS JOIN
(SELECT COUNT(*) AS TotalRows FROM MainQuery) MC
 where row between @rowstart and @rowend

或者

WITH MainQuery AS

(
  HUGE SELECT STATEMENT HERE
)
SELECT * INTO #foo

select * from #foo F
CROSS JOIN
(SELECT COUNT(*) AS TotalRows FROM #foo) M
where F.row between @rowstart and @rowend

或者

WITH MainQuery AS

(
  HUGE SELECT STATEMENT HERE
)
SELECT * INTO #foo
select * from #foo F where F.row between @rowstart and @rowend

SELECT @outparam = COUNT(*) FROM #foo
于 2011-01-12T05:06:58.673 回答
0

你听说过 OUTPUT 参数吗?您可以将行数存储在 OUTPUT 参数中,并让存储的过程返回行。

更多信息可以在这里找到

于 2011-01-12T00:17:49.913 回答