Является ли "SET NOCOUNT ON" хорошим выбором для тела хранимой процедуры заполнителя?

Эти ответы (1, 2), используя код из в этой статье, рекомендуем использовать оператор SET NOCOUNT ON в качестве временного заполнителя/фиктивного тела для хранимой процедуры, чье тело будет перезаписано в ближайшее время.

Ни в ответах, ни в этой статье не указывается, почему SET NOCOUNT ON выбрано как значение для тела временной хранимой процедуры.

Мой вопрос: Почему SET NOCOUNT ON хороший выбор для тела временной хранимой процедуры, который будет (если все будет хорошо) перезаписан в последующей операции? Есть ли лучшая альтернатива?

Некоторые критерии, которые приходят на ум для того, что может быть хорошим временным/хранителем хранимой процедуры:

  • Неправильно выполняется во время выполнения, если по какой-либо причине последующий ALTER хранимой процедуры не выполняется, как планировалось;
  • Легко понять будущие разработчики, сохраняющие хранимую процедуру;
  • Не добавляет значительных накладных расходов.

Ответ 1

Чтобы лучше соответствовать критериям моего вопроса, я заменил SET NOCOUNT ON выражением RAISERROR.

Мой код для проверки наличия хранимой процедуры перед запуском ALTER PROCEDURE выглядит так:

-- Create the sproc with a temporary body if it does not exist yet. 
-- We'll set the real body in the ALTER PROCEDURE statement below.
IF NOT EXISTS (
  SELECT * FROM sys.objects
    WHERE name = 'MyStoredProcedureNameHere'
    AND type = 'P'
) BEGIN
  EXEC ('CREATE PROCEDURE MyStoredProcedureNameHere AS
    RAISERROR (''The ALTER PROCEDURE to set the body for MyStoredProcedureNameHere did not run as it should have!'', 16, 1);');
END
GO

ALTER PROCEDURE MyStoredProcedureNameHere AS ...

Итак, если ALTER PROCEDURE каким-то образом не запускается, то если моя хранимая процедура будет выполнена, она выдаст ошибку, вместо того чтобы ничего не делать молча (как в случае с телом, состоящим только из SET NOCOUNT ON).

Кредит на этот подход: http://www.codeofhonor.com/blog/a-better-way-to-update-sql-stored-procedures

Ответ 2

Это, вероятно, потому, что включение SET NOCOUNT ON; считается хорошей практикой. Он включен в шаблон SP, сгенерированный SSMS. Из статьи MSDN на NOCOUNT:

NOCOUNT ON предотвращает отправку клиенту DONE_IN_PROC сообщений для каждый оператор в хранимой процедуре. Для хранимых процедур, которые содержат несколько утверждений, которые не возвращают много фактических данных, или для процедуры, содержащие контуры Transact-SQL, для установки SET NOCOUNT в положение ON может обеспечить значительное повышение производительности, поскольку сетевой трафик значительно сокращается.

Идея NOCOUNT сначала используется заполнитель. Позже вы добавляете, а не заменяете это утверждение.