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_object
któ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
Odpowiedzi:
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:
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
, isys.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 wBEGIN 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).
źródło