Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?
like image 442
Sam Avatar asked Jan 17 '15 10:01

Sam


2 Answers

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.

like image 138
umbreon222 Avatar answered Oct 17 '22 20:10

umbreon222


set in top of script

SET NOCOUNT ON;

like image 20
Ramil Gilfanov Avatar answered Oct 17 '22 19:10

Ramil Gilfanov