J'ai un programme client c # qui exécute des procédures stockées via ExectueNonQuery
, y compris la capture de la PRINT
sortie et de l'erreur avec les événements InfoMessage. Cela fonctionne bien, mais j'ai remarqué quelque chose d'étrange.
Lorsque j'exécute une procédure stockée à partir de SSMS, elle affiche les nombres de lignes pour chaque instruction SQL individuelle qui est exécutée dans l'onglet Messages (comme si elle provenait des InfoMessages). Cependant, mon programme ne voit jamais ces messages, bien qu'il intercepte tous les mêmes résultats. Au lieu de cela, il renvoie simplement les lignes affectées dans le résultat de la fonction ExecuteNonQuery qui est la somme de tous les décomptes de lignes individuels (ce qui est en quelque sorte inutile).
Par exemple, cette procédure:
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
Lorsque le foo
proc est exécuté, SSMS affiche les nombres de lignes de 662 et 59, mais ExecuteNonQuery
ne renvoie que le total de 721.
Alors, comment puis-je obtenir les mêmes informations que SSMS obtient?
Juste pour être clair ici: je ne suis pas intéressé par la façon de changer les procédures stockées pour ajouter des PRINT @@ROWCOUNT
s après chaque instruction SQL. Je sais comment faire et ce n'est pas une option la plupart du temps pour diverses raisons.
Je demande comment faire ce que SSMS fait ici. Je peux changer le code client tout ce que je veux à ce stade (pour le moment en tout cas) et je voudrais le faire correctement.