Как узнать количество строк, обработанных Stored Procedure?

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для определения количества обработанных строк после выполнения хранимой процедуры можно воспользоваться переменной @@ROWCOUNT.

SQL
Скопировать код
EXEC YourStoredProc;
SELECT @@ROWCOUNT as RowsAffected;  -- Узнаем количество обработанных строк

Этот запрос необходимо выполнять сразу после процедуры для получения корректных результатов.

Кинга Идем в IT: пошаговый план для смены профессии

Применение выходных параметров для получения результатов

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

SQL
Скопировать код
CREATE PROCEDURE YourStoredProc
    @RowsAffected INT OUTPUT
AS
BEGIN
    -- SQL-команды
    SET @RowsAffected = @@ROWCOUNT;
END

Количество обработанных строк можно будет получить при вызове процедуры следующим образом:

SQL
Скопировать код
DECLARE @RowCount INT;
EXEC YourStoredProc @RowsAffected = @RowCount OUTPUT;
SELECT @RowCount as RowsAffected; -- Вот и количество обработанных строк.

Работа с множественными операциями

Аккумулирование результатов операций

Если хранимая процедура состоит из нескольких операторов, накопите общее количество обработанных строк, чтобы не потерять эту информацию. Используйте @@ROWCOUNT после каждой операции.

SQL
Скопировать код
DECLARE @TotalRowCount INT = 0;
-- Первая SQL-операция
SET @TotalRowCount = @TotalRowCount + @@ROWCOUNT;
-- Вторая SQL-операция
SET @TotalRowCount = @TotalRowCount + @@ROWCOUNT;
-- и так далее

Данный подход позволяет учесть все строки, затронутые в процедуре.

Совместное учет строк и обработка ошибок

Совместите @@ERROR и @@ROWCOUNT для эффективной обработки ошибок. Запишите их немедленно после выполнения операции, чтобы последующие действия не изменили их значения.

SQL
Скопировать код
DECLARE @ErrorStatus INT, @AffectedRows INT;
-- SQL-команда
SET @ErrorStatus = @@ERROR;
SET @AffectedRows = @@ROWCOUNT;

IF @ErrorStatus != 0
BEGIN
    -- Обработка ошибки
END

Особенности работы в SQL Server

Активируйте SET NOCOUNT ON, чтобы SqlCommand.ExecuteNonQuery() возвращал ожидаемый результат. Иначе может возникнуть путаница, возвращаясь со значением -1.

SQL
Скопировать код
SET NOCOUNT ON; -- Вот так правильно!

Специфика работы в Oracle

Для пользователей Oracle есть переменная SQL%ROWCOUNT.

SQL
Скопировать код
-- После выполнения DML-операции в процедуре
affected_rows := SQL%ROWCOUNT; -- Для этого предназначена данная функция Oracle

Особенности использования SqlCommand

Метод SqlCommand.ExecuteNonQuery() позволяет получить количество обработанных строк. Однако будьте осторожны — отмена транзакции может изменить этот результат!

SQL
Скопировать код
EXEC YourStoredProc
-- SqlCommand может вернуть предупреждение: о нет, давайте вернемся назад!

Преход от новичка в SQL к мастеру

  • Сохраняйте результаты в выходных параметрах после каждой операции в рамках транзакции, так как они могут быть потеряны.
  • Сохраняйте количество обработанных строк с помощью транзакционных блоков для критически важных операций — безопасность прежде всего.
  • Документируйте результаты в таблицах, чтобы в будущем было легче искать ошибки, сидя ночью за чашкой кофе.

Визуализация

Рассмотрим индикатор, демонстрирующий успех театральной постановки 🎭:

Markdown
Скопировать код
| Сыгранная сцена  | Реакция аудитории |
| ---------------- | ------------------ |
| Монолог          | 👏👏👏               |
| Диалог           | 👏👏                |
| Финал акта       | 👏👏👏👏👏            |

Сравнивая подсчет аплодисментов 👏 с получением значения @@ROWCOUNT, можно увидеть, сколько 🌀строк🌀 было затронуто в вашей хранимой процедуре.

Полезные материалы

  1. Об @@ROWCOUNT можно узнать больше в официальной документации Microsoft.
  2. Прочтите о обработке ошибок в SQL Server в руководстве Redgate.
  3. Ознакомьтесь с рекомендациями по написанию оптимизированных хранимых процедур в T-SQL на сайте с советами по оптимизации от Redgate.