Ich habe ein Client-C # -Programm, das gespeicherte Prozeduren über ausführt ExectueNonQuery
, einschließlich des Abfangens der PRINT
und der Fehlerausgabe mit InfoMessage-Ereignissen. Es funktioniert gut, aber ich habe etwas Seltsames bemerkt.
Wenn ich eine gespeicherte Prozedur über SSMS ausführe, werden Zeilenanzahl für jede einzelne SQL-Anweisung angezeigt, die auf der Registerkarte Nachrichten ausgeführt wird (als ob sie von den InfoMessages stammen würde). Mein Programm sieht diese Nachrichten jedoch nie, obwohl es alle anderen Ausgaben abfängt. Stattdessen werden nur die Zeilen zurückgegeben, die im Ergebnis der ExecuteNonQuery-Funktion betroffen sind. Dies ist die Summe aller einzelnen Zeilenzählungen (was irgendwie nutzlos ist).
Zum Beispiel dieses Verfahren:
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
Wenn der foo
Prozess ausgeführt wird, zeigt SSMS Zeilenanzahl von 662 und 59 an, gibt jedoch ExecuteNonQuery
nur die Summe von 721 zurück.
Wie kann ich die gleichen Informationen erhalten, die SSMS erhält?
Um hier klar zu sein: Ich bin nicht daran interessiert, wie die gespeicherten Prozeduren geändert werden, um PRINT @@ROWCOUNT
nach jeder SQL-Anweisung s hinzuzufügen . Ich weiß, wie man das macht und es ist aus verschiedenen Gründen meistens keine Option.
Ich frage, wie ich das machen soll, was SSMS hier macht. Ich kann den Client-Code an dieser Stelle nach Belieben ändern (jedenfalls momentan) und möchte es richtig machen.