Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как получить название и тип выходных столбцов после выполнения процедуры?  [new]
headshrinker
Member

Откуда: Уфа
Сообщений: 7
Всем доброго времени суток!
Есть приложение на C# + MS SQL 2008.
Суть его работы такова: вводим название процедуры - выводятся все входные параметры и текст.
Проблема:
Хочу еще получать список столбцов которые выводит ХП.
Есть мысли что нужно ее выполнить чтобы получить мета данные столбцов, но только не понятно как их вытащить из БД.
Squirell выводит эти метаданные, но каждый раз копировать их оттуда адски неудобно.
27 дек 11, 09:57    [11830964]     Ответить | Цитировать Сообщить модератору
 Re: Как получить название и тип выходных столбцов после выполнения процедуры?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31987
headshrinker
Есть мысли что нужно ее выполнить чтобы получить мета данные столбцов, но только не понятно как их вытащить из БД.
Метаданные столбцов и так передаются приложению при выполнении процедуры, какая проблема-то?
27 дек 11, 10:20    [11831138]     Ответить | Цитировать Сообщить модератору
 Re: Как получить название и тип выходных столбцов после выполнения процедуры?  [new]
headshrinker
Member

Откуда: Уфа
Сообщений: 7
alexeyvg,

А как их получить в текстовом виде?

Дело в том что мне эти данные надо перевести в такой вид для Confluence:

|| Наименование поля || Тип || INOUT || Примечание ||
| @id_sessionDS | bigint | IN | |
| @i_start | int | INOUT | |
| @i_end | int | INOUT | |
| @i_pageLimit | int | IN | |
27 дек 11, 10:33    [11831258]     Ответить | Цитировать Сообщить модератору
 Re: Как получить название и тип выходных столбцов после выполнения процедуры?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Написать приложение, вызвать процедуру, расковырять рекордсет и вернуть метаданные в нужном виде.
27 дек 11, 10:37    [11831286]     Ответить | Цитировать Сообщить модератору
 Re: Как получить название и тип выходных столбцов после выполнения процедуры?  [new]
IUnIKnown
Member

Откуда:
Сообщений: 9
Есть системная таблица: syscomments в поле [text] скрипт процедуры, идентифицировать запись можно по полю [id] через функцию object_id. [id]=object_id('[Название процедуры]'). Весь скрипт процедуры разбивается по 4000 символов, поэтому для одной процедуры может быть несколько записей в таблице
27 дек 11, 11:18    [11831610]     Ответить | Цитировать Сообщить модератору
 Re: Как получить название и тип выходных столбцов после выполнения процедуры?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
IUnIKnown
Есть системная таблица: syscomments в поле [text] скрипт процедуры, идентифицировать запись можно по полю [id] через функцию object_id. [id]=object_id('[Название процедуры]'). Весь скрипт процедуры разбивается по 4000 символов, поэтому для одной процедуры может быть несколько записей в таблице
Процедура, которая может вызвать еще десяток других процедур и вернуть 100500 разных рекордсетов. Проще выполнить с set fmtonly, хотя и это будет не все.
27 дек 11, 11:24    [11831659]     Ответить | Цитировать Сообщить модератору
 Re: Как получить название и тип выходных столбцов после выполнения процедуры?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31987
IUnIKnown
Есть системная таблица: syscomments в поле [text] скрипт процедуры, идентифицировать запись можно по полю [id] через функцию object_id. [id]=object_id('[Название процедуры]'). Весь скрипт процедуры разбивается по 4000 символов, поэтому для одной процедуры может быть несколько записей в таблице
Это вы на какой вопрос отвечали? :-)
27 дек 11, 14:23    [11833110]     Ответить | Цитировать Сообщить модератору
 Re: Как получить название и тип выходных столбцов после выполнения процедуры?  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18328
Как из текста произвольного запроса получит список полей и их типы?
27 дек 11, 16:49    [11834217]     Ответить | Цитировать Сообщить модератору
 Re: Как получить название и тип выходных столбцов после выполнения процедуры?  [new]
headshrinker
Member

Откуда: Уфа
Сообщений: 7
Deff
Как из текста произвольного запроса получит список полей и их типы?


Спасибо за ссылку, но процедура ругается на 'execute' т.к. в курсор нельзя запихнуть Result set процедуры.
28 дек 11, 08:57    [11836843]     Ответить | Цитировать Сообщить модератору
 Re: Как получить название и тип выходных столбцов после выполнения процедуры?  [new]
headshrinker
Member

Откуда: Уфа
Сообщений: 7
IUnIKnown
Есть системная таблица: syscomments в поле [text] скрипт процедуры, идентифицировать запись можно по полю [id] через функцию object_id. [id]=object_id('[Название процедуры]'). Весь скрипт процедуры разбивается по 4000 символов, поэтому для одной процедуры может быть несколько записей в таблице


Текст процедуры мне не нужен)
28 дек 11, 08:58    [11836848]     Ответить | Цитировать Сообщить модератору
 Re: Как получить название и тип выходных столбцов после выполнения процедуры?  [new]
headshrinker
Member

Откуда: Уфа
Сообщений: 7
Гавриленко Сергей Алексеевич
IUnIKnown
Есть системная таблица: syscomments в поле [text] скрипт процедуры, идентифицировать запись можно по полю [id] через функцию object_id. [id]=object_id('[Название процедуры]'). Весь скрипт процедуры разбивается по 4000 символов, поэтому для одной процедуры может быть несколько записей в таблице
Процедура, которая может вызвать еще десяток других процедур и вернуть 100500 разных рекордсетов. Проще выполнить с set fmtonly, хотя и это будет не все.


Возможно придется вернуть в рекордсет с set fmtonly и с ним работать.
28 дек 11, 09:00    [11836858]     Ответить | Цитировать Сообщить модератору
 Re: Как получить название и тип выходных столбцов после выполнения процедуры?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31987
headshrinker
Гавриленко Сергей Алексеевич
пропущено...
Процедура, которая может вызвать еще десяток других процедур и вернуть 100500 разных рекордсетов. Проще выполнить с set fmtonly, хотя и это будет не все.


Возможно придется вернуть в рекордсет с set fmtonly и с ним работать.
С set fmtonly может не получиться, не всегда процедуры так могут работать, хотя попробовать можно.

Самый беспроигрышный вариант - просто выполнить и получить результат.
28 дек 11, 10:20    [11837232]     Ответить | Цитировать Сообщить модератору
 Re: Как получить название и тип выходных столбцов после выполнения процедуры?  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3755
Сама майкрософт!! в своем же SSIS не может нормально получить список полей и типов из процедуры если там есть что-то чуть сложнее чем один select. Хотя это не показатель, да...
28 дек 11, 14:36    [11839662]     Ответить | Цитировать Сообщить модератору
 Re: Как получить название и тип выходных столбцов после выполнения процедуры?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31987
Ivan Durak
Сама майкрософт!! в своем же SSIS не может нормально получить список полей и типов из процедуры если там есть что-то чуть сложнее чем один select. Хотя это не показатель, да...
Это показатель распространённости ошибки.

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

Но милионы программистов всё равно упорно пытаются :-)
28 дек 11, 15:29    [11840169]     Ответить | Цитировать Сообщить модератору
 Re: Как получить название и тип выходных столбцов после выполнения процедуры?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31987
alexeyvg
Ivan Durak
Сама майкрософт!! в своем же SSIS не может нормально получить список полей и типов из процедуры если там есть что-то чуть сложнее чем один select. Хотя это не показатель, да...
Это показатель распространённости ошибки.

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

Но милионы программистов всё равно упорно пытаются :-)
Хочу подчеркнуть, что "Сама майкрософт!!" в своем же SSIS не то что может, а это принципиально невозможно, поэтому и не получается, а правильно сделать не догадались.
28 дек 11, 15:30    [11840185]     Ответить | Цитировать Сообщить модератору
 Re: Как получить название и тип выходных столбцов после выполнения процедуры?  [new]
headshrinker
Member

Откуда: Уфа
Сообщений: 7
на .NET можно сделать через SqlDataReader.GetSchemaTable() который возвращает всю инфу которая мне нужна.

Но должна быть такая возможность на MSSQL, буду дальше искать)
28 дек 11, 17:07    [11841115]     Ответить | Цитировать Сообщить модератору
 Re: Как получить название и тип выходных столбцов после выполнения процедуры?  [new]
headshrinker
Member

Откуда: Уфа
Сообщений: 7
Спасибо всем за ответы
28 дек 11, 17:08    [11841121]     Ответить | Цитировать Сообщить модератору
 Re: Как получить название и тип выходных столбцов после выполнения процедуры?  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
headshrinker
Но должна быть такая возможность на MSSQL, буду дальше искать)
На MSSQL это будет заморочено:
1. Создаем loopback линкед сервер.
2. Определяем количество параметров процедуры.
3. Формируем строку вызова процедуры вида: set fmtonly on; exec <ИмяБД.ИмяВладельца.ИмяПроцедуры> null, null, null ...; set fmtonly off;.
4. Генерим уникальное имя для рабочей таблицы (например, имя пользователя + @@spid).
5. Формируем строку для выполнения: 'select * into tempdb..' + quotename(<Строка из п. 4>) + ' from openquery(' + quotename(<Имя сервера из п. 1>) + ', ' + quotename(<Строка из п. 3>, '''') + ')'.
6. Выполняем: exec(<Строка из п. 5>);
6. Забираем информацию о столбцах получившейся рабочей таблицы любым понравившемся способом.
7. Дропаем рабочую таблицу.
28 дек 11, 18:22    [11841662]     Ответить | Цитировать Сообщить модератору
 Re: Как получить название и тип выходных столбцов после выполнения процедуры?  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
Дополнение: Если процедура возвращает набор из временной таблицы, то вышеописанный способ не поможет.
28 дек 11, 18:47    [11841834]     Ответить | Цитировать Сообщить модератору
 Re: Как получить название и тип выходных столбцов после выполнения процедуры?  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3755
invm,

зачем линкед сервер?
зачем null в параметры передовать которые могут быть и нот нулл!!
и вообще можно сделать процедуру которая возвращают разные наборы полей в зависимости от параметров!

Ну и главное - после выполнения получать поля - это уже плохо!! и быстродействие и вообще последствия. мало ли что та процедура делает - бывают такие процедуры которые просто так, когда вздумается, вообще нельзя запускать!
28 дек 11, 19:51    [11842155]     Ответить | Цитировать Сообщить модератору
 Re: Как получить название и тип выходных столбцов после выполнения процедуры?  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
Ivan Durak,

Если знаете еще какой-либо способ получить метаданные набора, возвращаемого процедурой не выполняя ее, то поделитесь им с общественностью.
28 дек 11, 20:25    [11842314]     Ответить | Цитировать Сообщить модератору
 Re: Как получить название и тип выходных столбцов после выполнения процедуры?  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
возникла необходимость написания документации по уже существующей базе. для некоторой автоматизации процесса хотелось бы получать описание структуры (имена+типы полей) всех возвращаемых хранимками датасетов. вариант, описанный invm, подходит для хп, возвращающих один датасет, т.к. openquery/openrowset работает только с первым.

для обработки случаев с двумя и более датасетами придётся писать клиентское приложение, обрабатывающее результаты fmtonly on, или же есть вариант обойтись средствами сервера?
6 мар 12, 15:15    [12203970]     Ответить | Цитировать Сообщить модератору
 Re: Как получить название и тип выходных столбцов после выполнения процедуры?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31987
Shakill
для обработки случаев с двумя и более датасетами придётся писать клиентское приложение, обрабатывающее результаты fmtonly on, или же есть вариант обойтись средствами сервера?
Приложение не сможет получить список рекордсетов используя fmtonly on, это будет работать только иногда.

Единственный вариант - выполнять процедуры реально (и то некоторые рекордсеты можно не получить), или просто читать текст.

Так что нормальный вариант - получить результаты методом invm, а оставшиеся процедуры смотреть вручную. Хотя вручную всё равно придётся просмотреть всё.
6 мар 12, 16:01    [12204487]     Ответить | Цитировать Сообщить модератору
 Re: Как получить название и тип выходных столбцов после выполнения процедуры?  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
alexeyvg,

процедуры читать в любом случае придётся, я об автоматизации оформления, то есть 1) чтобы при описании датасетов имена+типы не приходилось полностью набирать руками 2) получать подсказки по типам, т.к. они не всегда очевидны

например, после выполнения хп в первом столбце третьего резалтсета обнаруживаются значения вида '1.34678'. по тексту хранимки ясно, что это не строка. но определить фактический числовой тип (float или decimal(сколько там?, 5)) уже так с лёту может и не получиться, если там всякие вложенности и вычисления, а явного приведения в конце нет

и да, допустим что случай простой и типы при разных вызовах одни и те же :)
6 мар 12, 16:32    [12204795]     Ответить | Цитировать Сообщить модератору
 Re: Как получить название и тип выходных столбцов после выполнения процедуры?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Тут тоже можно рассмотреть вариант в SqlParser: 9167323
По идее он выдаёт точные типы.

0. По всем хранимкам:
1. грузим в SqlParser
2. Циклим по всем операторам нахоит тип аля Query (to pipeline)
3. Вложенно рекурсивно по вызовам процедур (EXEC)
4. Забираем метаданные
5. ...
6. PROFIT
6. Выкладываем этот простенький код сюда в форум
7. PROFIT

6 мар 12, 20:27    [12206481]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить