Ho un programma client c # che sta eseguendo procedure memorizzate tramite ExectueNonQuery
, incluso l' PRINT
output di Error ed Error con eventi InfoMessage. Funziona bene, ma ho notato qualcosa di strano.
Quando eseguo una procedura memorizzata da SSMS, vengono visualizzati i conteggi delle righe per ogni singola istruzione SQL eseguita nella scheda Messaggi (come se provenisse dagli InfoMessage). Comunque il mio programma non vede mai questi messaggi, sebbene catturi tutti gli stessi altri output. Al contrario, restituisce solo le righe interessate dal risultato della funzione ExecuteNonQuery che è la somma di tutti i singoli conteggi delle righe (che è piuttosto inutile).
Ad esempio, questa procedura:
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 foo
viene eseguito il proc, SSMS visualizza i conteggi delle righe di 662 e 59, ma ExecuteNonQuery
restituisce solo il totale di 721.
Quindi, come posso ottenere le stesse informazioni che SSMS sta ricevendo?
Giusto per essere chiari qui: non sono interessato a come modificare le stored procedure per aggiungere PRINT @@ROWCOUNT
s dopo ogni istruzione SQL. So come farlo e non è un'opzione per la maggior parte del tempo per una serie di motivi.
Sto chiedendo come fare ciò che SSMS sta facendo qui. Posso cambiare il codice client tutto quello che voglio a questo punto (per ora, comunque) e vorrei farlo nel modo giusto.