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.