J'ai un programme client c # qui exécute des procédures stockées via ExectueNonQuery, y compris la capture de la PRINTsortie 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 fooproc est exécuté, SSMS affiche les nombres de lignes de 662 et 59, mais ExecuteNonQueryne 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 @@ROWCOUNTs 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.