ВЫКЛЮЧИТЬ NOCOUNT или ВОЗВРАТ @@ ROWCOUNT?

Я создаю хранимую процедуру в базе данных Sql Server 2008. Я хочу вернуть количество затронутых строк. Какой вариант лучше ВЫКЛЮЧИТЬ NOCOUNT или 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 по умолчанию отключен внутри хранимых процедур. Можно ли изменить это поведение в моей базе данных?


person niaher    schedule 15.06.2009    source источник


Ответы (5)


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

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

person CJM    schedule 15.06.2009

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

person onupdatecascade    schedule 26.08.2009
comment
Для этого есть причина: последний раз, когда я проверял, RETURN ограничен значениями shortint, т. Е. Максимальное возвращаемое значение составляет 65535. - person enorl76; 07.08.2012
comment
В настоящее время значение RETURN - INT, а не SHORTINT. docs.microsoft.com/en- us / sql / t-sql / language-elements / Я бы все равно не рекомендовал использовать его ни для чего, кроме кодов ошибок. - person Zusukar; 21.07.2020

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

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

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

person RichardOD    schedule 15.06.2009
comment
Я не вижу ничего упомянутого о SET NOCOUNT в документации SqlCommand. Вы уверены, что здесь та же проблема, что и с DataAdapters? - person niaher; 15.06.2009
comment
Google it - вы найдете множество доказательств того, что это действительно так: google.co.uk/. Я не могу быть уверен, что это та же проблема, что и DataAdapters, не тестируя ее, но я не понимаю, почему может быть другая причина. - person RichardOD; 15.06.2009

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

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

person Law Kant    schedule 29.12.2011

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

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

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

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

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

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

person Ashutosh    schedule 23.12.2013
comment
Неправильно, по умолчанию значение SET NOCOUNT в SQL Server отключено. - person panky sharma; 13.08.2019