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

时间:2015-01-17 10:04:46

标签: c# sql-server merge-replication

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

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

  

触发器返回结果集和/或以SET NOCOUNT OFF运行   而另一个出色的结果集是活跃的。

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

我检查了什么:

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

    1. 如何避免这种行为及其首先发生的原因?
    2. 为什么要取消公开交易?

4 个答案:

答案 0 :(得分:3)

触发器返回各种“结果集”,即受影响的行数。 “(1行(s)受影响)//或n行....”我不知道为什么这被解释为结果集但它确实如此。

今天我遇到了类似的问题,我意识到可以通过在触发器结束时设置一个SET NOCOUNT来解决此问题。仅在触发器顶部设置SET NOCOUNT是不够的。

我所指的触发器是你的应用程序中预先制作的“insert”语句。这很可能是抛出SQL错误的声明。

现在你可以使用sp_configure'disallow results from triggers'1,但是,这会为整个数据库禁用它,这可能是不可取的,以防你期望其他触发器返回结果集。

如果我的回答不够,我使用的Source的OP描述了你遇到的完全相同的问题。此外,MSDN曾说过

  

将在SQL Server的未来版本中删除从触发器返回结果集的功能。避免在新的开发工作中从触发器返回结果集,并计划修改当前执行此操作的应用程序。若要防止触发器在SQL Server 2005中返回结果集,请将“禁止触发器结果”选项设置为1.在将来的SQL Server版本中,此选项的默认设置为1。

答案 1 :(得分:0)

我遇到了同样的问题并找到了解决方案。

问题是带有结果集的存储过程,该结果集在此触发器中执行。

看来,这个存储过程导致触发器也有结果集。

答案 2 :(得分:0)

我遇到了同样的问题。

问题是带有select:

的插入
insert into table (...)
select ...

问题是select有一个group语句并返回:

  

警告:聚合或其他SET操作消除了空值。

这导致了问题,我通过max(field)更改了指令max(coalesce(field,''))以避免max group函数中的空操作。

答案 3 :(得分:0)

在脚本顶部设置

开启NOCOUNT;