2011-01-12 155 views
0

希望这很简单。我正在优化一个返回约500行以上的存储过程。我的计划是批量返回行,直到没有更多的行获得。如何从SQL Server存储过程返回行和变量

例如,我会得到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。任何帮助表示赞赏!

+0

这是一个寻呼类型需要? - 即你并不总是需要503行? – 2011-01-12 00:42:01

回答

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 
0

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

更多信息,可以发现here