powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / как получить список выводимых полей хранимой процедуры
44 сообщений из 44, показаны все 2 страниц
как получить список выводимых полей хранимой процедуры
    #38883569
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть например процедура
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
create proc dbo.ClientList@ID int as
begin
  select 
    C.ID
    C.Name
    C.Phone
    C.Email
  from Client C
end


как получить список выводимых полей хранимой процедуры
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883571
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG81как получить список выводимых полей хранимой процедуры
Получить где - на клиенте или на сервере ?
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883573
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорри нужен sql запрос к системным таблицам
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883574
хмхмхм
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PG81,

select * from sys.parameters as p
where p.object_id = object_id('schema.proc')
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883579
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хмхмхмPG81,

select * from sys.parameters as p
where p.object_id = object_id('schema.proc')При чём здесь параметры?
А если процедура возвращает несколько датасетов?
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883582
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap,

об этом я не подумал, но по идее предполагается, что процедура возвращает только один датасет
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883583
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG81но по идее предполагается, что процедура возвращает только один датасет
Т.е. сервер должен запрещать создание процедур, которые возвращают множество наборов ?
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883585
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG81iap,

об этом я не подумал, но по идее предполагается, что процедура возвращает только один датасетНо параметры-то по-любому здесь не при чём.
Надо же узнать поля датасетов.
На клиенте, кстати, это всё можно сделать. В компонентах ADO, например.
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883596
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG81как получить список выводимых полей хранимой процедурыЗачем?
Чтобы динамически построить таблицу и положить в нее результата выполнения процедуры?
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883616
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

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

Я решил переделать этот механизм и найти возможность добавления описания полей процедурой в БД без открывания датасета, если это возможно конечно.
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883618
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glory,

наверное нет необходимости запрещать несколько датасетов
у меня среди сотен процедур в БД нет ни одной где бы использовалась такая возможность.
Но если вдруг такая появится, то может просто список полей первого датасета
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883621
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG81наверное нет необходимости запрещать несколько датасетов
у меня среди сотен процедур в БД нет ни одной где бы использовалась такая возможность.
Тогда почему вы не создаете объекты, которые по своей изначальной природе всегда возвращают один, заранее определенный набор ? Что и позволяет иметь информацию об этом наборе в системных таблицах
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883626
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glory,

так вот именно такие хранимки и делаю
авторЧто и позволяет иметь информацию об этом наборе в системных таблицах
у меня как раз вопрос как получить эту информацию запросом SQL?
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883630
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG81так вот именно такие хранимки и делаю
Еще раз
Хранимая процедура может возвращать много наборов. И ваше личное обязательство не возращать больше одного набора ничего не меняет.

PG81у меня как раз вопрос как получить эту информацию запросом SQL?
Для объектов, которые могут возаращать только один набор по своей приводе, информация о столбцах хранится в sys.columns
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883646
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glory,

Код: sql
1.
2.
3.
select c.name, c.length from syscolumns c
join sysobjects o on o.id = c.id
where o.name = 'ProcName'


Этот запрос возвращает список параметров процедуры
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883651
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG81Этот запрос возвращает список параметров процедуры
Вы ответы читаете вообще ?
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883654
хмхмхм
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iap,

сорри, с утра видимо не проснулся. Показалось, что автор спрашивал именно про параметры.
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883661
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Glory,
авторДля объектов, которые могут возвращать только один набор по своей приводе, информация о столбцах хранится в sys.columns

попробовал такой запрос
Код: sql
1.
2.
3.
select * from sys.columns c
join sysobjects o on o.id = c.object_id
where o.name = 'ProcLst'


Выдает пусто. Видимо что-то делаю не так.
Отсюда вопросы
1.Что значит объекты, которые могут возвращать только один набор по своей природе?как-то по особенному делать хп или что?
2.Что я делаю не так или где я не внимательно прочитал что-то прочитал ответы?
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883662
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG81,

Для 2012 и выше - sp_describe_first_result_set
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883663
хмхмхм
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PG81,

Можно попробовать поковыряться в тексте процедуры, возвращаемым запросом:
Код: sql
1.
EXEC sp_helptext 'schema.proc';
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883665
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG81Отсюда вопросы
1.Что значит объекты, которые могут возвращать только один набор по своей природе?как-то по особенному делать хп или что?
Это те объекты, в которых физически невозможно написать возврат нескольких наборов.
Потому что это будет нарушением синтаксиса.
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883666
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а помоему ТС пошел по пути потыки написать очередной "совершенно независимый код" со все5ми вытекающими....
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883836
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG81,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE procedure AAA(@n nvarchar(123)) as
select 1 as one,'333' as two;
select 'dddd' as one, @n two;

SET FMTONLY ON;

exec AAA 'www'

SET FMTONLY OFF;
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883864
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxxа помоему ТС пошел по пути потыки написать очередной "совершенно независимый код" со все5ми вытекающими....как вариант - выполнить процедуру, получить датасет, зачитать поля и их типы. Будет независимо.
Можно даже узнать сколько датасетов у ХП.
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883877
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSVкак вариант - выполнить процедуру, получить датасет, зачитать поля и их типы. Будет независимо.
Можно даже узнать сколько датасетов у ХП.
я откровенно не разделяю ваш "оптимизм" по поводу таких систем...
Зачем ето пытаються делать - язнаю, НО пратическое применение такого - в моем понимаю ето производная между граблефабрикой и условно поддерживаемым кодом. Не стоит пытать рожать "ООП" на скл, не его ето стихия. Опять же -все ето мое скромное имхо
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883887
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если младше 2012-го:
Метаданные первого возвращаемого набора
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
use tempdb;
go

create procedure dbo.spTest
 @a int,
 @b datetime,
 @c varchar(100)
as
begin
 set nocount on;

 select * from sys.objects;
 select * from sys.columns;
end;
go

if object_id('tempdb..#c', 'U') is not null
 drop table #c;

select top (0) * into #c from INFORMATION_SCHEMA.COLUMNS;

declare @s nvarchar(max), @p nvarchar(max);

select @s = N'select * into #t from openrowset(''SQLNCLI'', ''Server=.' + 
            isnull(N'\' + cast(serverproperty('InstanceName') as sysname), N'') +
            N';Trusted_Connection=yes;Database=' + db_name() + ''', ''set fmtonly on; exec dbo.spTest' + isnull(@p, N'') +
            '''); insert into #c select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = object_name(object_id(''#t''));' 
exec(@s);

select * from #c;
go

drop procedure dbo.spTest;
go


ЗЫ: Для процедур, возвращающих набор из временной таблицы, работать не будет.
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883955
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,
Я же выше привел код, которым пользуется LinqToSql для получения метаинформации для хранимых процедур. Там все наборы выдает.
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883982
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВinvm,
Я же выше привел код, которым пользуется LinqToSql для получения метаинформации для хранимых процедур. Там все наборы выдает.
ТСу нужно получить информацию о рекордсете(ах) на tsql.
Какой ему прок от пустых рекордсетов?
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883993
o-o
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
o-o
Гость
ЕвгенийВinvm,
Я же выше привел код, которым пользуется LinqToSql для получения метаинформации для хранимых процедур. Там все наборы выдает.
a вы различаете "все наборы" и " метаданные первого набора"?

to invm : пример не очень рабочий:
Msg 201, Level 16, State 4, Procedure spTest, Line 0
Procedure or function 'spTest' expects parameter '@a', which was not supplied.
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883994
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выложил вариант с ошибкой. Исправленный:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
use tempdb;
go

create procedure dbo.spTest
 @a int,
 @b datetime,
 @c varchar(100)
as
begin
 set nocount on;

 select * from sys.objects;
 select * from sys.columns;
end;
go

if object_id('tempdb..#c', 'U') is not null
 drop table #c;

select top (0) * into #c from INFORMATION_SCHEMA.COLUMNS;

declare @s nvarchar(max), @p nvarchar(max);

select @p = N' ' + stuff((select N', null' from sys.parameters where object_id = object_id(N'dbo.spTest') for xml path(''), type).value('.', 'nvarchar(max)'), 1, 2, '');
select @s = N'select * into #t from openrowset(''SQLNCLI'', ''Server=.' + 
            isnull(N'\' + cast(serverproperty('InstanceName') as sysname), N'') +
            N';Trusted_Connection=yes;Database=' + db_name() + ''', ''set fmtonly on; exec dbo.spTest' + isnull(@p, N'') +
            '''); insert into #c select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = object_name(object_id(''#t''));' 
exec(@s);

select * from #c;
go

drop procedure dbo.spTest;
go

...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38883996
o-o
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
o-o
Гость
invm,

оперативно :)
спасибо
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38884360
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

вывелось такое сообщение
SQL ServerSQL Server blocked access to STATEMENT 'OpenRowset/OpenDatasource' of component 'Ad Hoc Distributed Queries' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'Ad Hoc Distributed Queries' by using sp_configure. For more information about enabling 'Ad Hoc Distributed Queries', see "Surface Area Configuration" in SQL Server Books Online.
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38884379
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PG81вывелось такое сообщениеНу так в сообщении и написано, что нужно сделать.
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38884433
o-o
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
o-o
Гость
invm,
да ладно, там указано только, что админ может это сделать, но совсем не рассказывают, как его на такое подбить
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38884444
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
o-oно совсем не рассказывают, как его на такое подбить К каждому админу нужен индивидуальный подход
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38884529
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

политику конфиденциальности нарушать запретили
сделал по простому.
Пользователь указывает таблицу и добавляются все поля таблицы, а потом если нужно может удалить ненужные или еще добавить
удалять проще чем руками забивать все поля
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38885225
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВPG81,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE procedure AAA(@n nvarchar(123)) as
select 1 as one,'333' as two;
select 'dddd' as one, @n two;

SET FMTONLY ON;

exec AAA 'www'

SET FMTONLY OFF;



хотел бы добавить:

если процедура содержит динамический sql, при установленном "SET FMTONLY ON"
её выполнение в некоторых случаях может завершаться ошибкой (зависит от sql).

В таких ситуациях можно подхимичить в процедуре, чтоб даже при при установленном "SET FMTONLY ON"
возвращать схему:

Код: sql
1.
2.
3.
4.
5.
6.
set @sql='...'; --дин. sql для обычного выполнения

IF 1=0  --эта условие истино при "SET FMTONLY ON"
  set @sql='SELECT 1 AS Col1';  --sql для возврата схемы. 

exec sp_executesql @sql, ..... 
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38885297
PG81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Us,

если честно то не понял что к чему
по отдельности все понятно, но что вы имели ввиду я не понял
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38885525
o-o
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
o-o
Гость
PG81,

это к тому, что в процедурах с определенным IF/dynamic sql при FMTONLY ON поджидает засада с ошибкой,
вот пример, кода, запускать с fmtonly off и fmtonly on:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
if object_id('tempdb..#t') is not null 
begin
	select * from #t
end
else 
begin
	select 'table does not exist' as ErrMsg
end;
---
ErrMsg
table does not exist

------------------------------
------------------------------
set fmtonly on;

if object_id('tempdb..#t') is not null 
begin
	select * from #t
end
else 
begin
	select 'table does not exist' as ErrMsg
end;

set fmtonly off;
---
Msg 208, Level 16, State 0, Line 5
Invalid object name '#t'.


соответственно, если это оформить в виде процедуры, то и код invm упадет с той же ошибкой:
(0 row(s) affected)
Msg 208, Level 16, State 1, Procedure spTest, Line 6
Invalid object name '#t'.

умничающие построители отчетов этим страдают, вот темка по этому поводу,
где любимейший ВО вываливает ошибку "горе от ума" из-за присутствия динамики в процедуре:
передача параметра в процедуру через sp_execute
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38885528
o-o
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
o-o
Гость
вот еще камрад по ВО с той же печалью и workaround-ы:
багофича FMTONLY
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #38885773
Okmor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Передача табличных данных из хранимой процедуры:
http://habrahabr.ru/post/217649/
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
как получить список выводимых полей хранимой процедуры
    #39791551
pima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmВыложил вариант с ошибкой. Исправленный:
Код: sql
1.
2.
3.
4.
5.
6.
7.
...
select @s = N'select * into #t from openrowset(''SQLNCLI'', ''Server=.' + 
            isnull(N'\' + cast(serverproperty('InstanceName') as sysname), N'') +
            N';Trusted_Connection=yes;Database=' + db_name() + ''', ''set fmtonly on; exec dbo.spTest' + isnull(@p, N'') +
            '''); insert into #c select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = object_name(object_id(''#t''));' 
...
go



o-oinvm,
да ладно, там указано только, что админ может это сделать, но совсем не рассказывают, как его на такое подбить

Добрый день!
Долго думала, чего я не понимаю в этой жизни. Может правда не понимаю? Конструкцию insert into <таблица> exec <хранимая_процедура> уже отменили? Зачем здесь openrowset? Заодно и отпадет проблема с конфигурацией сервака и битием (подбиванием) админа :))
Объясните мне плииииз ))
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #39791554
pima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эээммм... да, поторопилась сильно, не подумала. insert into... exec естественно требует предварительного создания таблицы с перечислением полей. Тогда отпадает вообще смысл их определения из системного каталога ))) жаль тут нельзя удалить сообщение )
...
Рейтинг: 0 / 0
как получить список выводимых полей хранимой процедуры
    #39791560
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pima,


а еще не подумали что теме 4 года с гаком
...
Рейтинг: 0 / 0
44 сообщений из 44, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / как получить список выводимых полей хранимой процедуры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]