ВЫКЛЮЧИТЬ ОТКЛЮЧИТЬ или ВОЗВРАТИТЬ @@ ROWCOUNT? - PullRequest
17 голосов
/ 15 июня 2009

Я создаю хранимую процедуру в базе данных 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 по умолчанию выключен внутри хранимых процедур. Можно ли изменить это поведение в моей базе данных?

Ответы [ 5 ]

24 голосов
/ 15 июня 2009

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

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

5 голосов
/ 26 августа 2009

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

4 голосов
/ 15 июня 2009

Я знаю, что при установке SET NOCOUNT ON у DataAdapter возникнет конфликт параллелизма.

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

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

2 голосов
/ 29 декабря 2011

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

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

0 голосов
/ 23 декабря 2013

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

Ответ: мы можем понять это, выполнив шаги

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

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

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

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

...