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

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

Ответы на вопрос(3)

Решение Вопроса

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

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

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

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

Как уже упоминалось в другом ответе, вам нужно будет использоватьУСТАНОВИТЬ ТОЛЬКО НА чтобы убедиться, что данные не возвращаются. В некоторых ситуациях SET FMTONLY не будет работать, например, при использовании таблиц #temp в ваших хранимых процедурах, но естьобходной путь.

 tom redfern15 апр. 2016 г., 11:40
Для SQL2012 следуйте советам в этом посте:stackoverflow.com/a/14575114/569662
 Palu Macil16 сент. 2016 г., 21:34
Если Microsoft придерживается устаревшего DataTable в .NET Core, этот метод перестанет работать, если вы перейдете в Core.

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

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

 SET NO_BROWSETABLE ON; 
 SET FMTONLY ON;

exec dbo.aspnet_Roles_GetAllRoles @ApplicationName=NULL

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

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

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

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

+ Изменить

Select * from tablename

в

Select * INTO _tablename FROM tablename

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

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

Ваш ответ на вопрос