Есть ли способ через метаданные (Information_Schema, возможно?), чтобы получить список столбцов, возвращаемых sproc? Я пытаюсь автоматизировать некоторые поколения кода, и это очень поможет...
Получение имен столбцов/типов, возвращаемых из хранимой процедуры
Ответ 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.