dm_exec_describe_first_result_set_for_object dla wielu zestawów wyników

9

Czy istnieje procedura zwracająca metadane dla wszystkich zestawów wyników w procedurze przechowywanej?

Coś w stylu sys.dm_exec_describe_first_result_set_for_object, ale dla wszystkich zestawów wyników?

W końcu będę chciał odkryć metadane dla każdego zestawu wyników w każdej procedurze przechowywanej w bazie danych. Na razie zadowoliłbym się tylko zestawami wyników, sys.dm_exec_describe_first_result_set_for_objectktórych nie można opisać. Oznacza to, że 2., 3. i N. zestaw wyników.

Patrząc na użycie SQLCLR, aby to zrobić teraz:

Jak zapisać wyniki procedury z więcej niż jednym zestawem wyników
tSQLt - Testowanie jednostek DB dla SQL Server - ResultSetFilter.cs

JJS
źródło
3
Nie, nie ma czegoś takiego w SQL Server, musiałbyś do tego napisać kod (i prawdopodobnie musiałbyś zgadywać w wielu przypadkach).
Aaron Bertrand

Odpowiedzi:

3

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

Solomon Rutzky
źródło