Чи існує процедура повернення метаданих для всіх наборів результатів у збереженій процедурі?
Ні і так.
Ні
Не існує чистих засобів T-SQL для доступу до більш ніж першого набору результатів. Навіть OPENROWSET та OPENQUERY мають однакове обмеження:
Хоча запит може повертати кілька наборів результатів, OPEN (ROWSET | QUERY) повертає лише перший.
Для запису я не кажу ні про те, що є якась загальна технічна причина цього обмеження. Я просто вказуючи на те , що обмеження не обмежується sp_describe_first_result_set
, sys.dm_exec_describe_first_result_set
і sys.dm_exec_describe_first_result_set_for_object
.
Так
Єдиний спосіб збору інформації - метаданих набору результатів і навіть результатів - для наборів результатів 2 - n - через код програми. Спочатку слід виконати запити / збережену процедуру, використовуючи SqlCommand.ExecuteReader (CommandBehavior) з CommandBehavior of KeyInfo
. Потім ви можете отримати метадані набору результатів за допомогою методу SqlDataReader.GetSchemaTable та виклику методу SqlDataReader.NextResult, щоб пройти цикл через набори результатів. Просто майте на увазі , що, роблячи це з допомогою програми коду не має обмежень не працює з динамічним SQL і тимчасових таблиць, це робитьнасправді запустіть код SQL, і якщо у вас є оператори DML і хочете лише метадані набору результатів, не викликаючи жодних змін даних, вам доведеться загортати тестування SQL в BEGIN TRAN
/ ROLLBACK TRAN
.
Тип програми може бути звичайним додатком для Windows, консольним додатком, веб-додатком тощо, або навіть це може бути функція SQLCLR / збережена процедура.
Що стосується цього за допомогою SQLCLR, вже існує збережена процедура, яка робить те, що описано тут. Він називається DB_DescribeResultSets і є частиною бібліотеки SQL # (якою я є автором, і поки існує безкоштовна версія, DB_DescribeResultSets доступний лише у повній версії).