触发器返回结果集和/或以SET NOCOUNT OFF运行,而另一个未完成的结果集处于活动状态

我有2台服务器通过低速连接连接,我们正在运行带有Merge复制的SQL Server 2008。

在订阅者,有时在尝试插入新行时,我收到此错误:

触发器返回结果集和/或以SET NOCOUNT OFF运行,而另一个未完成的结果集处于活动状态。

  • 我的数据库没有任何触发器; 唯一的触发器是Merge复制创建的触发器
  • 此外,每当发生此错误时,它会自动回滚现有事务
  • 我正在使用DataTablesTableAdapters来使用事务插入和更新数据库

我检查了什么:

  1. 数据库日志文件大小低于50Mb
  2. 检查了Zombie事务的源代码(因为我无法在开始时检索实际错误)
  3. 检查了两台服务器之间的连接,发现它很拥挤

问题:

  1. 如何避免这种行为以及为什么它首先发生?
  2. 为什么取消开放交易?

触发器返回各种“结果集”,即受影响的行数。 “(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操作。