Gibt es eine Prozedur zum Zurückgeben von Metadaten für alle Ergebnismengen in einer gespeicherten Prozedur?
Nein und Ja.
Nein
Es gibt kein reines T-SQL-Mittel, um auf mehr als die erste Ergebnismenge zuzugreifen. Sogar OPENROWSET und OPENQUERY haben die gleiche Einschränkung:
Obwohl die Abfrage möglicherweise mehrere Ergebnismengen zurückgibt, gibt OPEN (ROWSET | QUERY) nur die erste zurück.
Ich sage weder, noch impliziere ich, dass es einen gemeinsamen technischen Grund für diese Einschränkung gibt. Ich weise darauf hin , dass die Beschränkung nicht auf das beschränkt ist sp_describe_first_result_set
, sys.dm_exec_describe_first_result_set
und sys.dm_exec_describe_first_result_set_for_object
.
Ja
Die einzige Möglichkeit, Informationen - Metadaten der Ergebnismenge und sogar die Ergebnisse - für die Ergebnismengen 2 - n zu erfassen, ist der Anwendungscode. Sie würden zuerst die Abfragen / gespeicherten Prozeduren ausführen, indem Sie SqlCommand.ExecuteReader (CommandBehavior) mit einem CommandBehavior von verwenden KeyInfo
. Anschließend können Sie die Metadaten der Ergebnismenge mithilfe der SqlDataReader.GetSchemaTable- Methode abrufen und die SqlDataReader.NextResult- Methode aufrufen, um die Ergebnismengen zu durchlaufen. Denken Sie daran , dass während dieses Code über App tut nicht die Grenzen von nicht mit Dynamic SQL und temporären Tabellen arbeiten, es tutFühren Sie den SQL-Code tatsächlich aus. Wenn Sie über DML-Anweisungen verfügen und nur die Metadaten der Ergebnismenge verwenden möchten, ohne Datenänderungen zu verursachen, müssen Sie das zu testende SQL in ein BEGIN TRAN
/ einschließen ROLLBACK TRAN
.
Der Anwendungstyp kann eine reguläre Windows-App, Konsolen-App, Web-App usw. oder sogar eine SQLCLR-Funktion / gespeicherte Prozedur sein.
In Bezug auf dies über SQLCLR existiert bereits eine gespeicherte Prozedur, die das tut, was hier beschrieben wird. Es heißt DB_DescribeResultSets und ist Teil der SQL # -Bibliothek (deren Autor ich bin. Obwohl es eine kostenlose Version gibt, ist DB_DescribeResultSets nur in der Vollversion verfügbar).