问题
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
andTableAdapters
to insert and update the database using transactions
What I have checked:
- the database log file size is below 50Mb
- Checked the source code for Zombie transactions (since I wasn't able to retrieve the actual error at the beginning)
- Checked the connection between the two servers and found it congested
Questions:
- How to avoid this behavior and why it's occurring at first place?
- 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