Для INSERT
, UPDATE
и DELETE
операторов SQL, выполняемых непосредственно против базы данных, большинство поставщиков баз данных возвращают количество затронутых строк. Для хранимых процедур количество затронутых записей всегда -1
.
Как мы получаем количество записей, на которые влияет хранимая процедура?
Зарегистрируйте параметр out для хранимой процедуры и установите значение на основе @@ROWCOUNT при использовании SQL Server. Используйте SQL% ROWCOUNT, если вы используете Oracle.
Помните, что если у вас есть несколько INSERT/UPDATE/DELETE, вам понадобится переменная для хранения результата из @@ROWCOUNT для каждой операции.
@@RowCount
предоставит вам количество записей, на которые влияет SQL-запрос.
@@RowCount
работает только при немедленном выпуске. Поэтому, если вы являетесь ошибками ловушки, вам нужно сделать это в одной строке. Если вы разделите его, вы пропустите тот, который вы ставите вторым.
SELECT @NumRowsChanged = @@ROWCOUNT, @ErrorCode = @@ERROR
Если у вас несколько операторов, вам нужно будет зафиксировать количество строк, затронутых для каждого, и добавить их.
SELECT @NumRowsChanged = @NumRowsChanged + @@ROWCOUNT, @ErrorCode = @@ERROR
Оказывается, что SET NOCOUNT ON
был установлен в хранимой процедуре script (по умолчанию в SQL Server Management Studio), а SqlCommand.ExecuteNonQuery();
всегда возвращался -1.
Я просто отключил: SET NOCOUNT OFF
без использования @@ROWCOUNT
.
Подробнее здесь: SqlCommand.ExecuteNonQuery() возвращает -1 при вставке/обновлении/удалении
Для Microsoft SQL Server вы можете вернуть переменную @@ROWCOUNT, чтобы вернуть количество строк, затронутых последним оператором в хранимой процедуре.
ПРЕДУПРЕЖДЕНИЕ: @@ROWCOUNT
может возвращать поддельные данные, если измененная таблица имеет прикрепленные к ней триггеры!
@@ROWCOUNT
вернет количество записей, на которые влияет TRIGGER, а не фактическое утверждение!