如何从SQL Server存储过程返回行和变量

时间:2011-01-12 00:12:54

标签: sql sql-server-2005 stored-procedures rowcount

希望这很简单。我正在优化一个返回大约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。任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

您听说过OUTPUT参数吗?您可以将行计数存储在OUTPUT参数中,并使存储的proc返回行。

可以找到更多信息here

答案 2 :(得分:0)

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

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

如果你想从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