Eu tenho um programa cliente c # que está executando procedimentos armazenados via ExectueNonQuery
, incluindo a captura da PRINT
saída e Error com eventos do InfoMessage. Funciona bem, mas notei algo estranho.
Quando executo um procedimento armazenado do SSMS, ele exibe contagens de linhas para cada instrução SQL individual que é executada na guia Mensagens (como se viesse do InfoMessages). No entanto, meu programa nunca vê essas mensagens, apesar de capturar todas as mesmas saídas. Em vez disso, ele retorna as linhas afetadas no resultado da função ExecuteNonQuery que é a soma de todas as contas de linha individuais (o que é meio inútil).
Por exemplo, este procedimento:
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
Quando o processo foo
é executado, o SSMS exibe contagens de linhas de 662 e 59, mas ExecuteNonQuery
retorna apenas o total de 721.
Então, como posso obter as mesmas informações que o SSMS está recebendo?
Só para esclarecer aqui: não estou interessado em como alterar os procedimentos armazenados para adicionar PRINT @@ROWCOUNT
s após cada instrução SQL. Eu sei como fazer isso e não é uma opção na maioria das vezes por vários motivos.
Estou perguntando como fazer o que o SSMS está fazendo aqui. Eu posso alterar o código do cliente tudo o que eu quero neste momento (por enquanto, de qualquer maneira) e gostaria de fazê-lo corretamente.
fonte
PRINT
eRAISERROR(..., 10, 1)
vêm após os conjuntos de resultados. Estou tentando encontrar a mensagem solicitada nessa documentação, mas até agora não a encontrei.O resultado da execução da consulta simplesmente não fará o que você deseja aqui. Mas você ainda pode chegar lá, depende apenas do motivo pelo qual deseja usar as informações.
Você pode adicionar esta linha após cada inserção "PRINT @@ ROWCOUNT" e deve obter o número de linhas afetadas pela operação anterior como parte da saída (onde você obtém "barra".
Como alternativa, você pode adicionar um parâmetro "OUTPUT" ao seu procedimento armazenado para manter os resultados e capturá-lo quando você executa a consulta de execução.
EDITAR:
Consegui modificar o exemplo que Jonathan Kehasias reuniu para incluir a manipulação de eventos concluídos da instrução. Basta adicionar essas duas linhas.
fonte