Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 как узнать тип поля в результате запроса  [new]
vlv74
Member

Откуда: Брянск
Сообщений: 73
Доброго всем времени суток.

подскажите, как узнать типы получаемых в результате запроса полей?
SELECT [sAMAccountName],[msrtcsip-userenabled],[objectguid]
FROM OPENQUERY(ADSI,'SELECT sAMAccountName,msrtcsip-userenabled,objectguid FROM ''LDAP://DC=Domain,DC=ru'' where objectCategory=''person'' and cn=''Валентин Лебедев''')


дело в том, что запрос формируется динамически, и заранее неизвестно какие поля будут в результате запроса.
я хотел бы также динамически создавать временную таблицу, а потом обрабатывать её в зависимости от типа поля.
15 май 16, 11:58    [19175147]     Ответить | Цитировать Сообщить модератору
 Re: как узнать тип поля в результате запроса  [new]
vlv74
Member

Откуда: Брянск
Сообщений: 73
а вот собственно результат запроса
Картинка с другого сайта.
15 май 16, 12:07    [19175164]     Ответить | Цитировать Сообщить модератору
 Re: как узнать тип поля в результате запроса  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
vlv74
я хотел бы также динамически создавать временную таблицу
Только для этого знать типы столбцов не обязательно:
SELECT [sAMAccountName],[msrtcsip-userenabled],[objectguid]
INTO #ВременнаяТаблица
FROM OPENQUERY(ADSI,'SELECT sAMAccountName,msrtcsip-userenabled,objectguid FROM ''LDAP://DC=Domain,DC=ru'' where objectCategory=''person'' and cn=''Валентин Лебедев''')
15 май 16, 12:21    [19175187]     Ответить | Цитировать Сообщить модератору
 Re: как узнать тип поля в результате запроса  [new]
vlv74
Member

Откуда: Брянск
Сообщений: 73
автор
а потом обрабатывать её в зависимости от типа поля.
15 май 16, 12:31    [19175206]     Ответить | Цитировать Сообщить модератору
 Re: как узнать тип поля в результате запроса  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34659
vlv74
Доброго всем времени суток.

подскажите, как узнать типы получаемых в результате запроса полей?
SELECT [sAMAccountName],[msrtcsip-userenabled],[objectguid]
FROM OPENQUERY(ADSI,'SELECT sAMAccountName,msrtcsip-userenabled,objectguid FROM ''LDAP://DC=Domain,DC=ru'' where objectCategory=''person'' and cn=''Валентин Лебедев''')


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


Клиентское приложение в API взаимодействии с сервером всегда имеет функции или другие средства для описания полей набора данных.
15 май 16, 12:55    [19175278]     Ответить | Цитировать Сообщить модератору
 Re: как узнать тип поля в результате запроса  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34659
vlv74
я хотел бы также динамически создавать временную таблицу, а потом обрабатывать её в зависимости от типа поля.


А это, делать это на стороне СУБД -- очень странное желание, это же не Excel, это РСУБД.
.
15 май 16, 12:58    [19175286]     Ответить | Цитировать Сообщить модератору
 Re: как узнать тип поля в результате запроса  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
vlv74,

В том месте где динамический запрос формируется, можно сразу и информацию о структуре результата формировать.
15 май 16, 13:12    [19175311]     Ответить | Цитировать Сообщить модератору
 Re: как узнать тип поля в результате запроса  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
vlv74
автор
а потом обрабатывать её в зависимости от типа поля.

Имея на руках созданную временную таблицу всегда можно узнать типы ее полей.
sys.columns, например.
15 май 16, 13:14    [19175316]     Ответить | Цитировать Сообщить модератору
 Re: как узнать тип поля в результате запроса  [new]
Rankatan
Member

Откуда:
Сообщений: 250
Можно еще так узнать
SQL_VARIANT_PROPERTY(clm,'BaseType'),SQL_VARIANT_PROPERTY(clm,'Precision') , SQL_VARIANT_PROPERTY(clm,'Scale')
15 май 16, 13:16    [19175320]     Ответить | Цитировать Сообщить модератору
 Re: как узнать тип поля в результате запроса  [new]
vlv74
Member

Откуда: Брянск
Сообщений: 73
ситуация такая,
я получаю в результате запроса некие данные разных типов.
в дальнейшем эти данные надо преобразовать командой unpivot, а для неё необходимо чтоб все поля были одного типа.
если просто использовать CAST, то поля с типом binary
вместо 0x3ACCB4A6602E9A459C55F132AD6253AD
будут отображаться как :Ì´¦`.šEœUñ2­bS
а мне необходимо чтоб отображались именно в формате binary,
а для того чтоб преобразовывать только нужные поля, необходимо знать первоначальный формат.
15 май 16, 13:19    [19175326]     Ответить | Цитировать Сообщить модератору
 Re: как узнать тип поля в результате запроса  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Rankatan
Можно еще так узнать
SQL_VARIANT_PROPERTY(clm,'BaseType'),SQL_VARIANT_PROPERTY(clm,'Precision') , SQL_VARIANT_PROPERTY(clm,'Scale')
в мсдн это все же делается на полем типа sql_variant.
15 май 16, 13:22    [19175336]     Ответить | Цитировать Сообщить модератору
 Re: как узнать тип поля в результате запроса  [new]
Rankatan
Member

Откуда:
Сообщений: 250
Mike_za
Rankatan
Можно еще так узнать
SQL_VARIANT_PROPERTY(clm,'BaseType'),SQL_VARIANT_PROPERTY(clm,'Precision') , SQL_VARIANT_PROPERTY(clm,'Scale')
в мсдн это все же делается на полем типа sql_variant.

Можно делать на обычных полях.
15 май 16, 13:22    [19175338]     Ответить | Цитировать Сообщить модератору
 Re: как узнать тип поля в результате запроса  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
vlv74
ситуация такая,
я получаю в результате запроса некие данные разных типов.
в дальнейшем эти данные надо преобразовать командой unpivot, а для неё необходимо чтоб все поля были одного типа.
если просто использовать CAST, то поля с типом binary
вместо 0x3ACCB4A6602E9A459C55F132AD6253AD
будут отображаться как :Ì´¦`.šEœUñ2­bS
а мне необходимо чтоб отображались именно в формате binary,
а для того чтоб преобразовывать только нужные поля, необходимо знать первоначальный формат.

Сейчас вам еще раз скажут, что анпайвот это не задача сервера.
Доступ к процедуре формирующий результат есть?
15 май 16, 13:24    [19175344]     Ответить | Цитировать Сообщить модератору
 Re: как узнать тип поля в результате запроса  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
Rankatan
Mike_za
пропущено...
в мсдн это все же делается на полем типа sql_variant.

Можно делать на обычных полях.

Ну очевидно, что можно при неявном касте обыного поля в вариант
15 май 16, 13:25    [19175345]     Ответить | Цитировать Сообщить модератору
 Re: как узнать тип поля в результате запроса  [new]
Rankatan
Member

Откуда:
Сообщений: 250
Mike_za
Rankatan
пропущено...

Можно делать на обычных полях.

Ну очевидно, что можно при неявном касте обыного поля в вариант

Проверил, действительно делается неявный каст.
15 май 16, 13:32    [19175359]     Ответить | Цитировать Сообщить модератору
 Re: как узнать тип поля в результате запроса  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52471
vlv74
я получаю в результате запроса некие данные разных типов.

Получаешь в где?
15 май 16, 13:59    [19175424]     Ответить | Цитировать Сообщить модератору
 Re: как узнать тип поля в результате запроса  [new]
vlv74
Member

Откуда: Брянск
Сообщений: 73
вот, собственно, весь запрос
SELECT [sAMAccountName],[msrtcsip-userenabled],[objectguid],[cn]
into #t
FROM OPENQUERY(ADSI,'SELECT sAMAccountName,msrtcsip-userenabled,objectguid,cn FROM ''LDAP://DC=domain,DC=ru'' where objectCategory=''person'' and cn=''Валентин Лебедев''')

select * from #t

SELECT SQL_VARIANT_PROPERTY([sAMAccountName],'BaseType') as [sAMAccountName_BaseType]
      ,SQL_VARIANT_PROPERTY([msrtcsip-userenabled],'BaseType') as [msrtcsip-userenabled_BaseType]
      ,SQL_VARIANT_PROPERTY([objectguid],'BaseType') as [objectguid_BaseType]
      ,SQL_VARIANT_PROPERTY([cn],'BaseType') as [cn_BaseType]
from #t

SELECT [sAMAccountName], [Atrebut], [Val] FROM (SELECT cast([sAMAccountName] as nvarchar(100)) as [sAMAccountName]
                                                      ,cast([msrtcsip-userenabled] as nvarchar(100)) as [msrtcsip-userenabled]
	                                              ,cast([objectguid] as nvarchar(100)) as [objectguid]
  						      ,cast([cn] as nvarchar(100)) as [cn] from #t) p 
UNPIVOT ([Val] FOR [Atrebut] IN ([cn],[msrtcsip-userenabled],[objectguid]))AS unpvt

drop table #t


после выполнения получаю следующее
Картинка с другого сайта.

а хотелось бы данное поле отображать в исходном виде
15 май 16, 14:45    [19175535]     Ответить | Цитировать Сообщить модератору
 Re: как узнать тип поля в результате запроса  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
А анпайвот вы собираетесь без динамики сделать?
15 май 16, 14:53    [19175545]     Ответить | Цитировать Сообщить модератору
 Re: как узнать тип поля в результате запроса  [new]
vlv74
Member

Откуда: Брянск
Сообщений: 73
всё динамикой,
количество и названия полей по выбору пользователя

всего около 80-90 полей
15 май 16, 14:58    [19175555]     Ответить | Цитировать Сообщить модератору
 Re: как узнать тип поля в результате запроса  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
vlv74,

create table #t (id int, name nvarchar(100), f bit, b varbinary(8000));

insert into #t
values
 (1, N'Тест', 1, newid());

select * from #t;
go

declare @s varchar(max);

select @s = (
 select
  'alter table #t alter column ' + quotename(name) + ' sql_variant null; '
 from
  tempdb.sys.columns
 where
  object_id = object_id('tempdb..#t', 'U')
 for xml path(''), type).value('.', 'varchar(max)');

exec(@s);
go

select
 Attr, Val
from
 #t
unpivot
 (Val for Attr in (id, name, f, b)) unp
go

drop table #t;
go
15 май 16, 15:17    [19175589]     Ответить | Цитировать Сообщить модератору
 Re: как узнать тип поля в результате запроса  [new]
vlv74
Member

Откуда: Брянск
Сообщений: 73
Всем спасибо, то что нужно
15 май 16, 15:36    [19175616]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить