logo

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

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

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

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

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

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

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

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.