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.
fuente
PRINT
yRAISERROR(..., 10, 1)
vienen después de los conjuntos de resultados. Estoy tratando de encontrar el mensaje que ordena en esa documentación pero hasta ahora no lo he encontrado.El resultado de ejecución de consulta simplemente no va a hacer lo que quiere aquí. Pero aún puede llegar allí, solo depende de para qué desea usar la información.
Puede agregar esta línea después de cada inserción "PRINT @@ ROWCOUNT" y debe obtener el número de filas afectadas por la operación anterior como parte de la salida (donde obtiene "bar".
Alternativamente, puede agregar un parámetro "OUTPUT" a su procedimiento almacenado para guardar los resultados y luego simplemente capturarlo cuando ejecute la consulta ejecutada.
EDITAR:
Me las arreglé para modificar la muestra que Jonathan Kehasias reunió para incluir el manejo de eventos con declaración completa. Solo agrega estas dos líneas.
fuente