Является ли "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
сначала используется заполнитель. Позже вы добавляете, а не заменяете это утверждение.