Inspirado por esta pregunta donde hay diferentes puntos de vista en SET NOCOUNT ...
¿Deberíamos usar SET NOCOUNT ON para SQL Server? ¿Si no, porque no?
Que hace Edit 6, el 22 de julio de 2011
Suprime el mensaje "xx filas afectadas" después de cualquier DML. Este es un conjunto de resultados y cuando se envía, el cliente debe procesarlo. Es pequeño, pero medible (ver las respuestas a continuación)
Para los desencadenantes, etc., el cliente recibirá múltiples "filas xx afectadas" y esto causa todo tipo de errores para algunos ORM, MS Access, JPA, etc. (vea las ediciones a continuación)
Antecedentes:
La práctica recomendada general aceptada (pensé hasta esta pregunta) es usarla SET NOCOUNT ON
en disparadores y procedimientos almacenados en SQL Server. Lo usamos en todas partes y un google rápido muestra muchos MVP de SQL Server que también están de acuerdo.
MSDN dice que esto puede romper un .net SQLDataAdapter .
Ahora, esto significa para mí que el SQLDataAdapter se limita a un procesamiento CRUD completamente simple porque espera que el mensaje "n filas afectadas" coincida. Entonces, no puedo usar:
- SI EXISTE para evitar duplicados (mensaje sin filas afectadas) Nota: use con precaución
- DONDE NO EXISTE (menos filas de lo esperado
- Filtre las actualizaciones triviales (por ejemplo, no hay datos que realmente cambien)
- Haga cualquier acceso a la tabla antes (como el registro)
- Ocultar complejidad o desnormalización
- etc.
En la pregunta marc_s (quién sabe sus cosas de SQL) dice que no lo use. Esto difiere de lo que pienso (y también me considero algo competente en SQL).
Es posible que me esté perdiendo algo (siéntase libre de señalar lo obvio), pero ¿qué piensan ustedes por ahí?
Nota: han pasado años desde que vi este error porque no uso SQLDataAdapter hoy en día.
Ediciones después de comentarios y preguntas:
Editar: Más pensamientos ...
Tenemos varios clientes: uno puede usar un C # SQLDataAdaptor, otro puede usar nHibernate de Java. Estos pueden verse afectados de diferentes maneras con SET NOCOUNT ON
.
Si considera los procedimientos almacenados como métodos, entonces es una mala forma (antipatrón) asumir que algunos procesamientos internos funcionan de cierta manera para sus propios fines.
Edición 2: un disparador que rompe la pregunta nHibernate , donde SET NOCOUNT ON
no se puede configurar
(y no, no es un duplicado de esto )
Edición 3: Aún más información, gracias a mi colega MVP
- KB 240882 , problema que causa desconexiones en SQL 2000 y versiones anteriores
- Demostración de aumento de rendimiento
Edición 4: 13 de mayo de 2011
¿Rompe Linq 2 SQL también cuando no se especifica?
Edición 5: 14 jun 2011
Rompe JPA, proceso almacenado con variables de tabla: ¿JPA 2.0 admite variables de tabla de SQL Server?
Edición 6: 15 ago 2011
La cuadrícula de datos "Editar filas" de SSMS requiere SET NOCOUNT ON: Actualizar disparador con GROUP BY
Edición 7: 07 mar 2013
Detalles más detallados de @RemusRusanu:
¿SET NOCOUNT ON realmente hace una gran diferencia de rendimiento?