Получить имена / типы столбцов, возвращенные из хранимой процедуры - PullRequest
16 голосов
/ 20 сентября 2010

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

Ответы [ 3 ]

14 голосов
/ 20 сентября 2010

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

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

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

Редактировать

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

10 голосов
/ 20 сентября 2010

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

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

 SET NO_BROWSETABLE ON; 
 SET FMTONLY ON;

exec dbo.aspnet_Roles_GetAllRoles @ApplicationName=NULL

Так что я полагаю, что не может быть никакого «более официального» способа сделать это.

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

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

3 голосов
/ 19 июля 2015

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

Изменить

Select * from tablename

на

Select * INTO _tablename FROM tablename

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

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

...