Как отключить результаты запроса при выполнении хранимой процедуры из хранимой процедуры? - PullRequest
21 голосов
/ 17 октября 2008

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

Спасибо! * * 1004

Ответы [ 6 ]

31 голосов
/ 17 октября 2008

Вы можете отказаться от наборов результатов в SQL Server Mgmt Studio 2005 выполнив следующие действия:

& Бык; Щелкните правой кнопкой мыши в окне запроса
& bull; Выберите «Параметры запроса»
& bull; Нажмите "узел" "Результаты" в левой панели дерева.
& bull; Отметьте «Отменить результаты после выполнения» в центре / справа от формы.

Вы можете попробовать его на

DECLARE @i int
SET @i = 1
WHILE (@i <= 100)
  BEGIN
    SELECT @i as Iteration
    SET @i = @i + 1
  END

14 голосов
/ 17 октября 2008

вы можете вставить результаты во временную таблицу, а затем удалить временную таблицу

create table #tmp (columns)

while
    ...
    insert into #tmp exec @RC=dbo.NoisyProc
    ...
end
drop table #tmp

в противном случае, вы можете изменить вызываемый метод, чтобы он принимал флаг, говорящий ему не выводить набор результатов?

9 голосов
/ 14 февраля 2011

Я знаю, что этот вопрос старый, но вы можете установить SET NOCOUNT ON, чтобы SP не выводил сообщение для каждой строки.

3 голосов
/ 17 октября 2008

Курсоры плохие. Не используйте повторно сохраненный код процедуры, если это означает, что вы должны выполнять основанную на множестве функцию с курсором. Лучше с точки зрения производительности писать код в установленной форме.

Мне кажется, я обеспокоен тем, что вы больше озабочены подавлением сообщений, чем тем, что у вас есть ошибка в курсоре.

1 голос
/ 17 октября 2008

Вероятно, ошибка вызвана слишком большим количеством возвращаемых наборов записей, а не ошибкой логики вашего 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), чтобы заставить вывод быть простым текстом, а не табличным набором записей. В конечном итоге вы достигнете другого предела (окно результатов не может обрабатывать бесконечное количество текста), но оно будет намного больше.

В приведенном выше примере вы не получите сообщение об ошибке после изменения результатов в текстовом виде!

0 голосов
/ 17 октября 2008

Место:

SET ROWCOUNT OFF
/* the internal SP */
SET ROWCOUNT ON

оберните это вокруг внутреннего SP, или вы можете даже сделать это вокруг оператора SELECT из исходного запроса, что предотвратит появление результатов.

...