SET NOCOUNT ON — это директива в Transact-SQL (для SQL Server), которая отключает автоматическую отправку серверных сообщений о количестве затронутых строк. По умолчанию SQL Server после выполнения инструкции (INSERT, UPDATE, DELETE, SELECT) возвращает клиенту сообщение вида «(5 rows affected)». Это удобно при отладке, но в продакшене такие «фоновые» уведомления создают лишний сетевой трафик и могут вызывать проблемы с некоторыми клиентскими приложениями или ORM-инструментами.
Как это работает
Когда вы пишете SET NOCOUNT ON, SQL Server перестаёт генерировать и отправлять эти сообщения. При этом сам запрос выполняется как обычно — данные обновляются, вставляются или удаляются, меняется только обратная связь с клиентом.
Важный нюанс
Функция @@ROWCOUNT всё равно обновляется даже при SET NOCOUNT ON. Если вам нужно программно узнать, сколько строк затронула конкретная инструкция внутри процедуры, вы можете смело использовать @@ROWCOUNT.
Для чего это нужно
Основная польза — в снижении сетевого трафика. В хранимых процедурах, особенно тех, что содержат циклы или несколько инструкций, отправка множества таких сообщений может заметно замедлять работу из-за накладных расходов на передачу данных. Подавляя их, вы уменьшаете объём передаваемой информации, что положительно сказывается на производительности.
Ещё один сценарий — работа с клиентскими приложениями, которые парсят эти сообщения. Иногда фреймворки ожидают определённый формат и могут выдать ошибку, если в потоке появляются неожиданные результирующие наборы. SET NOCOUNT ON помогает избежать такх конфликтов.
Как применять
Обычно эту директиву ставят в самом начале хранимой процедуры или триггера, сразу после объявления параметров. Часто рекомендуют также вернуть настройку в исходное состояние (SET NOCOUNT OFF) перед тем, как процедура начнёт возвращать результирующие наборы (например, через SELECT).
Пример:
CREATE PROCEDURE UpdateUserBalance @UserID INT, @Amount DECIMAL(18,2) AS
BEGIN
SET NOCOUNT ON;
UPDATE Users SET Balance = Balance + @Amount WHERE UserID = @UserID;
SET NOCOUNT OFF;
END
Как это работает
Когда вы пишете SET NOCOUNT ON, SQL Server перестаёт генерировать и отправлять эти сообщения. При этом сам запрос выполняется как обычно — данные обновляются, вставляются или удаляются, меняется только обратная связь с клиентом.
Важный нюанс
Функция @@ROWCOUNT всё равно обновляется даже при SET NOCOUNT ON. Если вам нужно программно узнать, сколько строк затронула конкретная инструкция внутри процедуры, вы можете смело использовать @@ROWCOUNT.
Для чего это нужно
Основная польза — в снижении сетевого трафика. В хранимых процедурах, особенно тех, что содержат циклы или несколько инструкций, отправка множества таких сообщений может заметно замедлять работу из-за накладных расходов на передачу данных. Подавляя их, вы уменьшаете объём передаваемой информации, что положительно сказывается на производительности.
Ещё один сценарий — работа с клиентскими приложениями, которые парсят эти сообщения. Иногда фреймворки ожидают определённый формат и могут выдать ошибку, если в потоке появляются неожиданные результирующие наборы. SET NOCOUNT ON помогает избежать такх конфликтов.
Как применять
Обычно эту директиву ставят в самом начале хранимой процедуры или триггера, сразу после объявления параметров. Часто рекомендуют также вернуть настройку в исходное состояние (SET NOCOUNT OFF) перед тем, как процедура начнёт возвращать результирующие наборы (например, через SELECT).
Пример:
CREATE PROCEDURE UpdateUserBalance @UserID INT, @Amount DECIMAL(18,2) AS
BEGIN
SET NOCOUNT ON;
UPDATE Users SET Balance = Balance + @Amount WHERE UserID = @UserID;
SET NOCOUNT OFF;
END
Просмотры: 12