触发器返回了一个结果集和/或在另一个未完成的结果集处于活动状态时以 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 的情况下运行 而另一个突出的结果集处于活动状态。
DataTables
和TableAdapters
使用事务插入和更新数据库
我检查过的内容:
-
数据库日志文件大小低于 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 运行的主要内容,如果未能解决你的问题,请参考以下文章