dm_exec_describe_first_result_set_for_object für mehrere Ergebnismengen

9

Gibt es eine Prozedur zum Zurückgeben von Metadaten für alle Ergebnismengen in einer gespeicherten Prozedur?

So etwas wie sys.dm_exec_describe_first_result_set_for_object, aber für alle Ergebnismengen?

Schließlich möchte ich die Metadaten für jede Ergebnismenge in jeder gespeicherten Prozedur in der Datenbank ermitteln. Im Moment würde ich mich nur mit den Ergebnismengen zufrieden geben, sys.dm_exec_describe_first_result_set_for_objectdie nicht beschrieben werden können. Das heißt, die 2., 3. und N-te Ergebnismenge.

Betrachten Sie die Verwendung von SQLCLR, um dies jetzt zu tun:

Speichern von Ergebnissen einer Prozedur mit mehr als einer Ergebnismenge
tSQLt - DB Unit Testing für SQL Server - ResultSetFilter.cs

JJS
quelle
3
Nein, es gibt so etwas in SQL Server nicht, Sie müssten Code schreiben, um dies zu tun (und Sie müssten wahrscheinlich in vielen Fällen Vermutungen anstellen).
Aaron Bertrand

Antworten:

3

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_setund 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).

Solomon Rutzky
quelle