SET NOCOUNT OFF или RETURN @@ROWCOUNT?

Я создаю хранимую процедуру в базе данных Sql Server 2008. Я хочу вернуть количество затронутых строк. Какой вариант лучше установить SET NOCOUNT OFF или RETURN @@ROWCOUNT?

ALTER PROCEDURE [dbo].[MembersActivateAccount]
    @MemberId uniqueidentifier
AS
BEGIN
    -- Should I use this?
    SET NOCOUNT OFF;

    UPDATE [dbo].Members SET accountActive = 1 WHERE id = @MemberId;
    --Or should I SET NOCOUNT ON and use the following line instead?
    --return @@ROWCOUNT;
END

Я знаю, что обе работают, но что является лучшим выбором и почему?


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

Ответ 1

Используйте @@RowCount. Он явный и прозрачный, он полностью контролируется вашим кодом, а не встроенным поведением.

В параметре NOCOUNT можно установить по умолчанию значение по умолчанию: ON (Optons > Query Execution > SQL Server > Дополнительно). Если вы установите его таким образом, но затем объявите SET NOCOUNT OFF в своей хранимой процедуре, то этот локальный параметр имеет приоритет.

Ответ 2

Не используйте RETURN для значений. По соглашению RETURN из хранимых процедур для кодов ошибок, 0 означает отсутствие ошибки и не-0, означающую какую-то проблему. Если вам нужны данные назад, подходящий способ сделать это - с параметром OUTPUT. Это немного контр-интуитивно понятное, основанное на использовании другими языками возврата.

Ответ 3

Я знаю, что если SET NOCOUNT ON сделает DataAdapter, существует конфликт concurrency.

Вы можете прочитать об этом в MSDN. Если код будет использоваться DataAdapters, то, очевидно, не используйте SET NOCOUNT ON.

Похоже, что SqlCommand также имеет такое поведение, которое, по моему мнению, является причиной того, почему DataAdapter имеет проблему (так как под капотом это будет использовать объект Command).

Ответ 4

Причины использования SET NOCOUNT ON/OFF:

Управление переполнением стека при вставке строк в любую таблицу. Передача сообщений T-Sql при выполнении запросов или вложенных запросов. Показать или просмотреть последние выполненные запросы. Чтобы получить информацию о последней рекордной эскалации.

Ответ 5

Почему мы используем SET NOCOUNT вкл/выкл ---

Ans: мы можем понять это, выполнив следующие шаги:

шаг 1: выполнить запрос "Выбрать топ 10 * из имени таблицы".

Шаг 2: открыть окно сообщения, в котором отображается сообщение "10 строк, затронутых". он создает дополнительные накладные расходы и продлевает время выполнения.

Шаг 3: для преодоления этих дополнительных накладных расходов мы используем SET NOCOUNT ON. Если он включен, он никогда не будет подсчитывать количество возвращаемых строк, вместо этого он посеял команды сообщений, выполненные успешно.

Шаг 4: По умолчанию NOCOUNT включен, тогда он подсчитывает количество возвращенных строк, поэтому мое предложение о том, что он должен отключиться при создании новых процедур для повышения производительности с сервера базы данных.