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.
quelle
PRINT
undRAISERROR(..., 10, 1)
-Nachrichten alle nach den Ergebnismengen kommen. Ich versuche, die Reihenfolge der Nachrichten in dieser Dokumentation zu finden, bin aber bisher nicht darauf gestoßen.Das Executenonquery-Ergebnis wird hier einfach nicht das tun, was Sie wollen. Aber Sie können immer noch dorthin gelangen, es hängt nur davon ab, wofür Sie die Informationen verwenden möchten.
Sie können diese Zeile nach jedem Einfügen von "PRINT @@ ROWCOUNT" hinzufügen und Sie sollten die Anzahl der Zeilen, die von der vorherigen Operation betroffen sind, als Teil der Ausgabe erhalten (wobei Sie "bar" erhalten.
Alternativ können Sie Ihrer gespeicherten Prozedur einen "OUTPUT" -Parameter hinzufügen, um die Ergebnisse zu speichern, und diesen dann einfach erfassen, wenn Sie die executenonquery ausführen.
BEARBEITEN:
Es ist mir gelungen, das von Jonathan Kehasias zusammengestellte Beispiel so zu ändern, dass es die Behandlung mit abgeschlossenen Anweisungen enthält. Fügen Sie einfach diese beiden Zeilen hinzu.
quelle