触发器返回结果集和/或以SET NOCOUNT OFF运行,而另一个未完成的结果集处于活动状态
我有2台服务器通过低速连接连接,我们正在运行带有Merge复制的SQL Server 2008。
在订阅者,有时在尝试插入新行时,我收到此错误:
触发器返回结果集和/或以SET NOCOUNT OFF运行,而另一个未完成的结果集处于活动状态。
- 我的数据库没有任何触发器; 唯一的触发器是Merge复制创建的触发器
- 此外,每当发生此错误时,它会自动回滚现有事务
- 我正在使用
DataTables
和TableAdapters
来使用事务插入和更新数据库
我检查了什么:
- 数据库日志文件大小低于50Mb
- 检查了Zombie事务的源代码(因为我无法在开始时检索实际错误)
- 检查了两台服务器之间的连接,发现它很拥挤
问题:
- 如何避免这种行为以及为什么它首先发生?
- 为什么取消开放交易?
触发器返回各种“结果集”,即受影响的行数。 “(1行(s)受影响)//或n行….”我不知道为什么这被解释为结果集但它确实如此。
我今天遇到了类似的问题,我意识到可以通过在触发器结束时设置一个SET NOCOUNT来解决此问题。 仅在触发器顶部设置SET NOCOUNT是不够的。
我所指的触发器是你的应用程序中预先制作的“insert”语句。这很可能是抛出SQL错误的语句。
现在你可以使用sp_configure’ 禁止触发器的结果 ‘1,但是,这将为整个数据库禁用此function,这可能是不可取的,以防你期望某些其他触发器返回结果集。
如果我的答案还不够,我使用的OP的OP描述了你遇到的完全相同的问题。 此外,MSDN曾说过
将在SQL Server的未来版本中删除从触发器返回结果集的function。 避免在新开发工作中从触发器返回结果集,并计划修改当前执行此操作的应用程序。 若要防止触发器在SQL Server 2005中返回结果集,请将“禁止触发器结果”选项设置为1.在将来的SQL Server版本中,此选项的默认设置为1。
我遇到了同样的问题,并有一个解决方案。
问题是带有结果集的存储过程,该结果集在此触发器中执行。
似乎这个存储过程导致触发器也具有结果集。
我有同样的问题。
问题是带有select的插入:
insert into table (...) select ...
问题是select有一个组语句并返回:
警告:聚合或其他SET操作消除了空值。
这导致了问题,我通过max(coalesce(field,''))
更改了指令max(field)
max(coalesce(field,''))
以避免max group函数中的null操作。