xact_abort sqlserver sirve que para off c# sql-server merge-replication

c# - sqlserver - Un disparador devolvió un conjunto de resultados y/o se estaba ejecutando con SET NOCOUNT OFF mientras otro conjunto de resultados pendiente estaba activo



set xact_abort on para que sirve (3)

El activador está devolviendo un "conjunto de resultados" de orden, el número de filas afectadas. "(1 fila (s) afectadas) // o n filas ...." No sé por qué esto se interpreta como un conjunto de resultados, pero sí lo es.

Hoy tuve un problema similar y me di cuenta de que este problema puede solucionarse colocando SET NOCOUNT OFF hacia el final del activador. El simple hecho de tener SET NOCOUNT ON en la parte superior del disparador no es suficiente.

El desencadenante al que me estoy refiriendo es la declaración de "inserción" pre-hecha en su aplicación. Esta es muy probablemente la declaración que arroja el error de SQL.

Ahora puede usar sp_configure '' no permitir resultados de los desencadenantes '' 1, pero eso deshabilitará esto para toda la base de datos y puede que no sea deseable, en caso de que esté esperando que otro desencadenador devuelva un conjunto de resultados.

El OP de la Source que utilicé describe exactamente el mismo problema que tiene si mi respuesta no es suficiente. Además, MSDN había dicho

La capacidad de devolver conjuntos de resultados de los activadores se eliminará en una versión futura de SQL Server. Evite devolver conjuntos de resultados de desencadenantes en nuevos trabajos de desarrollo y planee modificar aplicaciones que actualmente lo hacen. Para evitar que los desencadenantes devuelvan los conjuntos de resultados en SQL Server 2005, establezca la opción de desautorizar los resultados de desencadenadores en 1. La configuración predeterminada de esta opción será 1 en una versión futura de SQL Server.

Tengo 2 servidores conectados en un wan de baja velocidad y estamos ejecutando SQL Server 2008 con replicación de mezcla.

En el suscriptor, a veces cuando intento insertar nuevas filas, recibo este error:

Un disparador devolvió un conjunto de resultados y / o se estaba ejecutando con SET NOCOUNT OFF mientras otro conjunto de resultados pendiente estaba activo.

  • Mi base de datos no tiene ningún desencadenante; los únicos desencadenantes son los creados por la replicación de mezcla
  • Además, cada vez que se produce este error, se revierte automáticamente la transacción existente.
  • Estoy usando DataTables y TableAdapters para insertar y actualizar la base de datos utilizando transacciones

Lo que he comprobado:

  1. El tamaño del archivo de registro de la base de datos es inferior a 50 Mb.
  2. Revisé el código fuente para las transacciones de Zombie (ya que al principio no pude recuperar el error real)
  3. Verificó la conexión entre los dos servidores y la encontró congestionada

Preguntas:

  1. ¿Cómo evitar este comportamiento y por qué está ocurriendo en primer lugar?
  2. ¿Por qué está cancelando la transacción abierta?

Tengo el mismo problema y tengo una solución.

El problema fue un procedimiento almacenado con un conjunto de resultados, que se ejecutó en este desencadenador.

Parece que este procedimiento almacenado lleva al activador a tener un conjunto de resultados también.


Yo tuve el mismo problema.

El problema fue un inserto con seleccionar:

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

El problema era que select tenía declaraciones de grupo y devolvía:

Advertencia: el valor nulo se elimina mediante un agregado u otra operación SET.

esto causó el problema, cambié las instrucciones max(field) por max(coalesce(field,'''')) para evitar la operación nula en la función de grupo máximo.