Триггер возвратил набор результатов и/или работал с 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.