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

86

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

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

dthrasher
источник
1
Установить No Count тоже было моей проблемой. Чтобы проверить, выполните свою хранимую процедуру в студии управления и посмотрите, получаете ли вы счетчики, если да, то убедитесь, что у вас есть выходная переменная.
user2624356

Ответы:

80

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

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

OMG Пони
источник
46

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

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

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

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

SELECT @NumRowsChanged = @NumRowsChanged  + @@ROWCOUNT, @ErrorCode = @@ERROR
Радж Мор
источник
33

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

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

Более подробная информация находится здесь: SqlCommand.ExecuteNonQuery () возвращает -1 при выполнении Insert / Update / Delete

Чувак Паскалу
источник
У меня это работает. Моя сохраненная процедура - это просто операторы вставки, и, похоже, она работает. Благодарность!
Harvey Darvey
Благодарность! Хорошая работа по ссылке.
Лео Гурдиан,
8

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

Боб Мак
источник
-2

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

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

Майкл Кингсфорд Грей
источник
8
Оказывается, это неправда: stackoverflow.com/questions/7005225/…
Tao