Tengo un programa cliente C # que está ejecutando procedimientos almacenados a través de ExectueNonQuery
, incluida la captura PRINT
y la salida de error con eventos de InfoMessage. Funciona bien, pero he notado algo extraño.
Cuando ejecuto un procedimiento almacenado desde SSMS, muestra recuentos de filas para cada instrucción SQL individual que se ejecuta en la pestaña Mensajes (como si viniera de InfoMessages). Sin embargo, mi programa nunca ve estos mensajes, aunque capta todos los mismos resultados. En cambio, solo devuelve las filas afectadas en el resultado de la función ExecuteNonQuery que es la suma de todos los recuentos de filas individuales (lo cual es un poco inútil).
Por ejemplo, este procedimiento:
use [tempdb]
go
SELECT *
INTO MyCols
FROM sys.columns
go
CREATE PROC foo As
UPDATE MyCols
SET name = name + N''
-- SSMS shows (662 row(s) affected)
UPDATE MyCols
SET name = name + N''
WHERE name like '%x%'
-- SSMS shows (59 row(s) affected)
PRINT 'bar'
-- both SSMS and ExecuteNonQuery get this
-- ExecuteNonQuery returns 721 rows affected
GO
Cuando foo
se ejecuta el proceso, SSMS muestra recuentos de filas de 662 y 59, pero ExecuteNonQuery
solo devuelve el total de 721.
Entonces, ¿cómo puedo obtener la misma información que SSMS está recibiendo?
Solo para que quede claro aquí: no estoy interesado en cómo cambiar los procedimientos almacenados para agregar PRINT @@ROWCOUNT
s después de cada instrucción SQL. Sé cómo hacerlo y no es una opción la mayoría de las veces por una variedad de razones.
Estoy preguntando cómo hacer lo que SSMS está haciendo aquí. Puedo cambiar el código del cliente todo lo que quiero en este momento (por ahora, de todos modos) y me gustaría hacerlo bien.