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_object
die 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
Antworten:
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:
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
undsys.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 einBEGIN TRAN
/ einschließenROLLBACK 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).
quelle