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

72

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

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

  • 1
    «Задать номер» тоже было моей проблемой. Чтобы проверить, выполните свою хранимую процедуру в Management Studio и посмотрите, получите ли вы значения, если да, то убедитесь, что у вас есть выходная переменная.
Теги:
sql-server
tsql
plsql

6 ответов

72
Лучший ответ

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

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

39

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

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

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

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

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

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

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

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

  • 0
    Это работает для меня. Мой сохраненный процесс - это просто оператор вставки, и он, кажется, работает. Спасибо!
  • 0
    Спасибо! Хорошая работа по ссылке.
8

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

4
-1

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню