Как вернуть строки и переменную из хранимой процедуры SQL Server - PullRequest
0 голосов
/ 12 января 2011

Надеюсь, это просто.Я оптимизирую хранимую процедуру, которая возвращает около 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, и он возвращает диапазон строк, который я хочу идеально.

Проблема в том, что я хочу знать, что есть БОЛЬШЕ строк, которые можно получить после каждого запроса.Я думаю, что могу добиться этого, возвращая @@ ROWCOUNT после завершения блока MainQuery, но я не знаю, как получить диапазон возвращаемых строк И значение для @@ ROWCOUNT после каждого раза, когда SPказнены.

Когда я делаю начальный запрос на получение 50 возвращенных строк, если бы я мог знать, что есть 503 ВСЕГО строки таблицы, я могу сделать простую математику (503/50) и выяснить, сколько еще раз мне нужнопозвонить в ИП.Любая помощь приветствуется!

Ответы [ 3 ]

1 голос
/ 12 января 2011

Вы пробовали выходные параметры?

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

0 голосов
/ 12 января 2011

Другие ответы скажут вам, как получить ответ из сохраненного процесса ...

Я бы хотел отметить, что @@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 голосов
/ 12 января 2011

Вы слышали о параметрах OUTPUT?Вы можете сохранить количество строк в параметре OUTPUT, и сохраненный процесс возвращает строки.

Более подробную информацию можно найти здесь

...