Подтвердить что ты не робот

Как отключить результаты запроса при выполнении хранимой процедуры из хранимой процедуры?

Внутри хранимой процедуры в курсор вызывается другая хранимая процедура. Для каждого вызова в окне результатов 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

Спасибо!

4b9b3361

Ответ 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 из исходного запроса, что предотвратит появление результатов.