Как узнать количество строк, обработанных Stored Procedure?
Быстрый ответ
Для определения количества обработанных строк после выполнения хранимой процедуры можно воспользоваться переменной @@ROWCOUNT
.
EXEC YourStoredProc;
SELECT @@ROWCOUNT as RowsAffected; -- Узнаем количество обработанных строк
Этот запрос необходимо выполнять сразу после процедуры для получения корректных результатов.
Применение выходных параметров для получения результатов
Выходные параметры позволяют вам сохранять результаты, упрощая таким образом доступ к информации о количестве обработанных строк. В определение хранимой процедуры нужно включить выходной параметр, который будет хранить данное количество.
CREATE PROCEDURE YourStoredProc
@RowsAffected INT OUTPUT
AS
BEGIN
-- SQL-команды
SET @RowsAffected = @@ROWCOUNT;
END
Количество обработанных строк можно будет получить при вызове процедуры следующим образом:
DECLARE @RowCount INT;
EXEC YourStoredProc @RowsAffected = @RowCount OUTPUT;
SELECT @RowCount as RowsAffected; -- Вот и количество обработанных строк.
Работа с множественными операциями
Аккумулирование результатов операций
Если хранимая процедура состоит из нескольких операторов, накопите общее количество обработанных строк, чтобы не потерять эту информацию. Используйте @@ROWCOUNT после каждой операции.
DECLARE @TotalRowCount INT = 0;
-- Первая SQL-операция
SET @TotalRowCount = @TotalRowCount + @@ROWCOUNT;
-- Вторая SQL-операция
SET @TotalRowCount = @TotalRowCount + @@ROWCOUNT;
-- и так далее
Данный подход позволяет учесть все строки, затронутые в процедуре.
Совместное учет строк и обработка ошибок
Совместите @@ERROR и @@ROWCOUNT для эффективной обработки ошибок. Запишите их немедленно после выполнения операции, чтобы последующие действия не изменили их значения.
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.
SET NOCOUNT ON; -- Вот так правильно!
Специфика работы в Oracle
Для пользователей Oracle есть переменная SQL%ROWCOUNT
.
-- После выполнения DML-операции в процедуре
affected_rows := SQL%ROWCOUNT; -- Для этого предназначена данная функция Oracle
Особенности использования SqlCommand
Метод SqlCommand.ExecuteNonQuery()
позволяет получить количество обработанных строк. Однако будьте осторожны — отмена транзакции может изменить этот результат!
EXEC YourStoredProc
-- SqlCommand может вернуть предупреждение: о нет, давайте вернемся назад!
Преход от новичка в SQL к мастеру
- Сохраняйте результаты в выходных параметрах после каждой операции в рамках транзакции, так как они могут быть потеряны.
- Сохраняйте количество обработанных строк с помощью транзакционных блоков для критически важных операций — безопасность прежде всего.
- Документируйте результаты в таблицах, чтобы в будущем было легче искать ошибки, сидя ночью за чашкой кофе.
Визуализация
Рассмотрим индикатор
, демонстрирующий успех театральной постановки 🎭:
| Сыгранная сцена | Реакция аудитории |
| ---------------- | ------------------ |
| Монолог | 👏👏👏 |
| Диалог | 👏👏 |
| Финал акта | 👏👏👏👏👏 |
Сравнивая подсчет аплодисментов 👏 с получением значения @@ROWCOUNT
, можно увидеть, сколько 🌀строк🌀 было затронуто в вашей хранимой процедуре.
Полезные материалы
- Об
@@ROWCOUNT
можно узнать больше в официальной документации Microsoft. - Прочтите о обработке ошибок в SQL Server в руководстве Redgate.
- Ознакомьтесь с рекомендациями по написанию оптимизированных хранимых процедур в T-SQL на сайте с советами по оптимизации от Redgate.