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