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

Posted

技术标签:

【中文标题】触发器返回了一个结果集和/或在另一个未完成的结果集处于活动状态时以 SET NOCOUNT OFF 运行【英文标题】:A trigger returned a resultset and/or was running with SET NOCOUNT OFF while another outstanding result set was active 【发布时间】:2015-01-17 10:04:45 【问题描述】:

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

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

触发器返回结果集和/或在 SET NOCOUNT OFF 的情况下运行 而另一个突出的结果集处于活动状态。

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

我检查过的内容:

    数据库日志文件大小低于 50Mb 检查了 Zombie 事务的源代码(因为一开始我无法检索到实际错误) 检查两台服务器的连接,发现拥塞

问题:

    如何避免这种行为以及为什么会首先发生? 为什么取消未结交易?

【问题讨论】:

【参考方案1】:

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

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

我所指的触发器是您的应用程序中预先制作的“插入”语句。这很可能是引发 SQL 错误的语句。

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

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

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

【讨论】:

【参考方案2】:

设置在脚本顶部

设置无计数;

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

我遇到了同样的问题。

问题是使用 select 插入:

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

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

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

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

【讨论】:

以上是关于触发器返回了一个结果集和/或在另一个未完成的结果集处于活动状态时以 SET NOCOUNT OFF 运行的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 存储过程:返回结果集和输出参数

Java 和数据库:关于使用多个结果集和游标

在 Pandas 中加入一个数据集和 OneHotEncoder 的结果

生成子集集和未使用的元素

全局结果集,带参数的结果集和动态结果集(struts2)

Pig:UDF 未返回预期的结果集