Как я могу получить количество записей, затрагиваемых хранимой процедурой?

Для INSERT, UPDATE и DELETE операторов SQL, выполняемых непосредственно против базы данных, большинство поставщиков баз данных возвращают количество затронутых строк. Для хранимых процедур количество затронутых записей всегда -1.

Как мы получаем количество записей, на которые влияет хранимая процедура?

Ответ 1

Зарегистрируйте параметр out для хранимой процедуры и установите значение на основе @@ROWCOUNT при использовании SQL Server. Используйте SQL% ROWCOUNT, если вы используете Oracle.

Помните, что если у вас есть несколько INSERT/UPDATE/DELETE, вам понадобится переменная для хранения результата из @@ROWCOUNT для каждой операции.

Ответ 2

@@RowCount предоставит вам количество записей, на которые влияет SQL-запрос.

@@RowCount работает только при немедленном выпуске. Поэтому, если вы являетесь ошибками ловушки, вам нужно сделать это в одной строке. Если вы разделите его, вы пропустите тот, который вы ставите вторым.

SELECT @NumRowsChanged = @@ROWCOUNT, @ErrorCode = @@ERROR

Если у вас несколько операторов, вам нужно будет зафиксировать количество строк, затронутых для каждого, и добавить их.

SELECT @NumRowsChanged = @NumRowsChanged  + @@ROWCOUNT, @ErrorCode = @@ERROR

Ответ 3

Оказывается, что SET NOCOUNT ON был установлен в хранимой процедуре script (по умолчанию в SQL Server Management Studio), а SqlCommand.ExecuteNonQuery(); всегда возвращался -1.

Я просто отключил: SET NOCOUNT OFF без использования @@ROWCOUNT.

Подробнее здесь: SqlCommand.ExecuteNonQuery() возвращает -1 при вставке/обновлении/удалении

Ответ 4

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

Ответ 6

ПРЕДУПРЕЖДЕНИЕ: @@ROWCOUNT может возвращать поддельные данные, если измененная таблица имеет прикрепленные к ней триггеры!

@@ROWCOUNT вернет количество записей, на которые влияет TRIGGER, а не фактическое утверждение!