Триггер возвратил набор результатов и/или работал с SET NOCOUNT OFF, в то время как другой выдающийся результирующий набор был активен

У меня есть 2 сервера, подключенных по низкой скорости, и мы запускаем SQL Server 2008 с репликацией Merge.

У абонента, иногда при попытке вставить новые строки, я получаю эту ошибку:

Триггер возвратил набор результатов и/или работал с SET NOCOUNT OFF в то время как другой выдающийся результирующий набор был активным.

  • В моей базе данных нет триггеров; единственными триггерами являются те, которые созданы репликацией Merge
  • Кроме того, всякий раз, когда возникает эта ошибка, он автоматически откатывает существующую транзакцию
  • Я использую DataTables и TableAdapters для вставки и обновления базы данных с помощью транзакций

Что я проверил:

  • размер файла журнала базы данных ниже 50 МБ.
  • Проверял исходный код транзакций Zombie (так как я не смог получить фактическую ошибку в начале)
  • Проверял соединение между двумя серверами и обнаружил, что он перегружен

Вопросы:

  • Как избежать этого поведения и почему оно происходит на первом месте?
  • Почему он отменяет открытую транзакцию?

Ответы

Ответ 1

Триггер возвращает "результат" сортировки, количество затронутых строк. "(Затронуты 1 строка (ы))//или n строк...." Я не знаю, почему это интерпретируется как набор результатов, но это так.

Сегодня у меня была аналогичная проблема, и я понял, что эту проблему можно устранить, поставив SET NOCOUNT OFF в конец триггера. Просто наличие SET NOCOUNT ON в верхней части триггера недостаточно.

Триггер, в котором я имею в виду, - это готовый оператор "insert" в вашем приложении. Это, скорее всего, оператор, бросающий ошибку SQL.

Теперь вы можете использовать sp_configure 'disallow results from triggers' 1, но это отключит это для всей базы данных, и это может быть не так желательно, если вы ожидаете, что какой-либо другой триггер вернет набор результатов.

OP Источник Я использовал описанную ту же самую проблему, что и у вас, если моего ответа недостаточно. Кроме того, MSDN заявила

Возможность возврата наборов результатов из триггеров будет удалена в будущей версии SQL Server. Избегайте возвращения наборов результатов из триггеров в новую работу по разработке и планируйте изменять приложения, которые в настоящее время это делают. Чтобы предотвратить срабатывание триггеров в наборах результатов в SQL Server 2005, установите значения запрета на триггеры. Вариант 1. Значение по умолчанию для этого параметра будет 1 в будущей версии SQL Server.

Ответ 2

У меня такая же проблема и у меня есть решение.

Проблема заключалась в хранимых процедурах с набором результатов, который был запущен в этом триггере.

Кажется, что эта хранимая процедура приводит к тому, что триггер также имеет результирующий набор.

Ответ 3

У меня была та же проблема.

Проблема заключалась в вставке с выбором:

insert into table (...)
select ...

Проблема заключалась в том, что select имел оператор группы и возвращал:

Предупреждение: значение Null исключается агрегированием или другой операцией SET.

что вызвало проблему, я изменил инструкции max(field) на max(coalesce(field,'')), чтобы избежать нулевой операции в функции max group.