powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / как получить список выводимых полей хранимой процедуры
19 сообщений из 44, страница 2 из 2
как получить список выводимых полей хранимой процедуры
    #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
19 сообщений из 44, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / как получить список выводимых полей хранимой процедуры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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