A trigger returned a resultset and/or was running with SET NOCOUNT OFF while another outstanding result set was active

风格不统一 提交于 2020-01-01 07:37:27

问题


I have 2 servers connected over a low speed wan and we're running SQL Server 2008 with Merge replication.

At the subscriber, sometimes when attempting to insert new rows, I get this error:

A trigger returned a resultset and/or was running with SET NOCOUNT OFF while another outstanding result set was active.

  • My database doesn't have any triggers; the only triggers are the one created by the Merge replication
  • Also, whenever this error occurs it automatically rolls back the existing transaction
  • I am using DataTables and TableAdapters to insert and update the database using transactions

What I have checked:

  1. the database log file size is below 50Mb
  2. Checked the source code for Zombie transactions (since I wasn't able to retrieve the actual error at the beginning)
  3. Checked the connection between the two servers and found it congested

Questions:

  1. How to avoid this behavior and why it's occurring at first place?
  2. Why it's cancelling the open transaction?

回答1:


The trigger is returning a "resultset" of sorts, the number of rows affected. "(1 row(s) affected) // or n rows...." I don't know why this is being interpreted as a resultset but it is.

I had a similar issue today and I realized that this issue can be fixed by putting a SET NOCOUNT OFF towards the end of the trigger. Just having the SET NOCOUNT ON at the top of the trigger is not sufficient.

The trigger in which I am referring is the pre-made "insert" statement in your application.This is most likely the statement throwing the SQL error.

Now you can use sp_configure 'disallow results from triggers' 1, but, that will disable this for the entire database and that may not be desirable, in case you are expecting some other trigger to return a resultset.

The OP of the Source I used described the exact same problem you are having if my answer doesn't suffice. Also, MSDN had said

The ability to return result sets from triggers will be removed in a future version of SQL Server. Avoid returning result sets from triggers in new development work, and plan to modify applications that currently do this. To prevent triggers from returning result sets in SQL Server 2005, set the disallow results from triggers Option to 1. The default setting of this option will be 1 in a future version of SQL Server.




回答2:


I got the same issue and have a solution.

The problem was a stored-procedures with a result set, which was executed in this trigger.

It seems, that this stored-procedure leads the trigger to have a result set as well.




回答3:


I had the same problem.

The problem was an insert with select:

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

The problem was that select had a group statements and returned:

Warning: Null value is eliminated by an aggregate or other SET operation.

this causing the problem, I changed instructions max(field) by max(coalesce(field,'')) to avoid the null operation in max group function.




回答4:


set in top of script

SET NOCOUNT ON;



来源:https://stackoverflow.com/questions/27998361/a-trigger-returned-a-resultset-and-or-was-running-with-set-nocount-off-while-ano

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!