Подтвердить что ты не робот

Получение имен столбцов/типов, возвращаемых из хранимой процедуры

Есть ли способ через метаданные (Information_Schema, возможно?), чтобы получить список столбцов, возвращаемых sproc? Я пытаюсь автоматизировать некоторые поколения кода, и это очень поможет...

4b9b3361

Ответ 1

Если вы не готовы разбирать содержимое ROUTINE_DEFINITION в INFORMATION_SCHEMA.ROUTINES, то лучшим вариантом будет выполнение процедур и чтение информации столбца из возвращенных записей.

В .NET вы можете сделать это, прочитав результаты хранимой процедуры в DataTable и запросив свойство Columns.

Причина в том, что простой способ сделать это - хранимая процедура может потенциально возвращать разные наборы результатов на основе параметров. Нет фиксированного формата набора результатов, например, с определенными пользователем функциями.

Edit

Как уже упоминалось в другом ответе, вам нужно будет использовать SET FMTONLY ON, чтобы гарантировать, что данные не будут возвращены. Есть некоторые ситуации, когда SET FMTONLY не работает, например. при использовании #temp-таблиц в ваших хранимых процедурах, но существует обходной путь.

Ответ 2

Я просто запустил Profiler, чтобы увидеть, как Visual Studio делает это для перетаскивания сильно типизированного набора данных.

Это код, который он отправил.

 SET NO_BROWSETABLE ON; 
 SET FMTONLY ON;

exec dbo.aspnet_Roles_GetAllRoles @ApplicationName=NULL

Поэтому я предполагаю, что не может быть никакого "более официального" способа сделать это.

Очевидно, вам нужно иметь в виду, что одна хранимая процедура может возвращать несколько наборов результатов или разных наборов результатов, зависящих от переданных параметров.

Для людей в 2012 году другой подход может заключаться в использовании sp_describe_first_result_set

Ответ 3

Мой способ сделать это: Отредактируйте хранимую процедуру, чтобы иметь предложение INTO:

Измените

Select * from tablename

к

Select * INTO _tablename FROM tablename

Это создает таблицу в базе данных. Затем используйте SELECT * FROM INFORMATION_SCHEMA WHERE TABLE_NAME = '_tablename'

Не забудьте отменить модификацию sproc.