Czy istnieje procedura zwracająca metadane dla wszystkich zestawów wyników w procedurze przechowywanej?
Nie i tak.
Nie
Nie ma czystego T-SQL dostępu do więcej niż pierwszego zestawu wyników. Nawet OPENROWSET i OPENQUERY mają te same ograniczenia:
Chociaż zapytanie może zwrócić wiele zestawów wyników, OPEN (ROWSET | QUERY) zwraca tylko pierwszy.
Dla przypomnienia, nie mówię ani nie sugeruję, że istnieje jakikolwiek wspólny techniczny powód tego ograniczenia. Jestem po prostu wskazując, że ograniczenie nie jest ograniczone do sp_describe_first_result_set
, sys.dm_exec_describe_first_result_set
, i sys.dm_exec_describe_first_result_set_for_object
.
tak
Jedynym sposobem na przechwycenie informacji - meta-danych zestawu wyników, a nawet wyników - dla zestawów wyników 2 - n jest kod aplikacji. Najpierw należy wykonać kwerendy / procedury składowane za pomocą SqlCommand.ExecuteReader (CommandBehavior) z wartością CommandBehavior wynoszącą KeyInfo
. Następnie można uzyskać metadane zestawu wyników, używając metody SqlDataReader.GetSchemaTable i wywołując metodę SqlDataReader.NextResult , aby przełączać się między zestawami wyników. Wystarczy pamiętać, że robiąc to za pomocą kodu aplikacja nie ma ograniczenia nie działa Dynamic SQL i tabel tymczasowych, to robifaktycznie uruchom kod SQL, a jeśli masz instrukcje DML i chcesz tylko meta-danych zestawu wyników bez powodowania jakichkolwiek zmian danych, wówczas będziesz musiał owinąć testowany SQL w BEGIN TRAN
/ ROLLBACK TRAN
.
Typem aplikacji może być zwykła aplikacja Windows, aplikacja konsoli, aplikacja internetowa itp., A nawet może to być funkcja / procedura składowana SQLCLR.
Jeśli chodzi o robienie tego za pośrednictwem SQLCLR, już istnieje procedura składowana, która wykonuje to, co opisano tutaj. Nazywa się DB_DescribeResultSets i jest częścią biblioteki SQL # (której jestem autorem i chociaż istnieje wersja darmowa, DB_DescribeResultSets jest dostępna tylko w pełnej wersji).