Как отключить результаты запроса при выполнении хранимой процедуры из хранимой процедуры?
Внутри хранимой процедуры в курсор вызывается другая хранимая процедура. Для каждого вызова в окне результатов SQL Management Studio отображается результат. Курсор петли более 100 раз, и в этот момент окно результатов сбрасывается с ошибкой. Есть ли способ, которым я могу остановить хранимую процедуру внутри курсора, выводя какие-либо результаты?
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC @RC = dbo.NoisyProc
SELECT @RValue2 = 1 WHERE @@ROWCOUNT = 0
FETCH NEXT FROM RCursor INTO @RValue1, @RValue2
END
Спасибо!
Ответы
Ответ 1
вы можете вставить результаты в таблицу temp, затем отбросить таблицу temp
create table #tmp (columns)
while
...
insert into #tmp exec @RC=dbo.NoisyProc
...
end
drop table #tmp
В противном случае вы можете изменить вызываемый proc, чтобы принять флаг, говорящий ему не выводить результирующий набор?
Ответ 2
Вы можете отменить набор результатов в SQL Server Mgmt Studio 2005
, выполнив следующие шаги:
& Бык; Щелкните правой кнопкой мыши в окне запроса
& bull; Выберите" Параметры запроса "
& bull; Нажмите "Результаты" "node" в виде дерева левой панели
& bull; Установите флажок" Отменить результаты после выполнения" в центре/справа от формы
Вы можете попробовать его на
DECLARE @i int
SET @i = 1
WHILE (@i <= 100)
BEGIN
SELECT @i as Iteration
SET @i = @i + 1
END
Ответ 3
Я знаю, что этот вопрос старый, но вы можете установить SET NOCOUNT ON
, чтобы SP не выводил сообщение для каждой строки.
Ответ 4
Курсоры плохие. Не используйте повторно исполняемый код proc, если это означает, что вы должны использовать функцию с помощью курсора. Лучше для производительности писать код в наборе.
Я думаю, что я обеспокоен тем, что вы больше обеспокоены подавлением сообщений, чем вы, поскольку у вас есть ошибка в курсоре.
Ответ 5
Вероятно, ошибка возникает из-за слишком большого количества возвращаемых записей, а не из-за логического недостатка вашего SP или самого курсора. Посмотрите на этот пример:
DECLARE @I INT
SET @I=0
WHILE @I<200 BEGIN
SELECT * FROM INFORMATION_SCHEMA.TABLES
SET @I = @I + 1
END
Будет выполняться несколько раз (чуть больше 100), а затем с:
Запрос превысил максимальное количество наборов результатов, которое может отображаться в сетке результатов. В сетке отображаются только первые 100 наборов результатов.
SSMS имеет ограничение на количество наборов записей, которые он может вам показать.
Один быстрый способ обходить это ограничение - нажать Ctrl + T (или меню Query- > Results to- > Results to Text), чтобы заставить вывод быть в виде обычного текста, а не в виде табличных наборов записей. В конечном итоге вы достигнете другого ограничения (окно результатов не может обрабатывать бесконечное количество вывода текста), но оно будет намного больше.
В приведенном выше примере вы не получите ошибку после изменения результатов в текстовой форме!
Ответ 6
Место:
SET ROWCOUNT OFF
/* the internal SP */
SET ROWCOUNT ON
оберните это вокруг внутреннего SP, или вы даже можете сделать это вокруг инструкции SELECT из исходного запроса, что предотвратит появление результатов.