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

Откуда:
Сообщений: 2694
Скажите пожалуйста, как сделать так, чтобы именем Элемента XML было значение поля таблицы?
Куда копать?

Заранее благодарен.
8 сен 11, 13:56    [11247313]     Ответить | Цитировать Сообщить модератору
 Re: Динамический элемент в XML  [new]
Leran2002
Member

Откуда: Алматы, Казахстан
Сообщений: 53
Здравствуйте!

Не совсем то,
но может быть вам использование атрибутов подойдет?

SELECT ID AS "@id",DESCR
FROM STOCK FOR XML PATH('STOCK'),ROOT('WH')
Результат:
<WH>
<STOCK id="1"><DESCR>111111111111111111</DESCR></STOCK>
<STOCK id="2"><DESCR>22222222222222222</DESCR></STOCK>
</WH>
8 сен 11, 14:15    [11247519]     Ответить | Цитировать Сообщить модератору
 Re: Динамический элемент в XML  [new]
vah
Member

Откуда:
Сообщений: 2694
Leran2002
Здравствуйте!

Не совсем то,
но может быть вам использование атрибутов подойдет?

SELECT ID AS "@id",DESCR
FROM STOCK FOR XML PATH('STOCK'),ROOT('WH')
Результат:
<WH>
<STOCK id="1"><DESCR>111111111111111111</DESCR></STOCK>
<STOCK id="2"><DESCR>22222222222222222</DESCR></STOCK>
</WH>


Благодарю, но мне надо такой результат:

<WH><STOCK1 id="1"><DESCR>111111111111111111</DESCR></1STOCK><STOCK2 id="2"><DESCR>22222222222222222</DESCR></2STOCK></WH>

Такое реально?
8 сен 11, 14:18    [11247540]     Ответить | Цитировать Сообщить модератору
 Re: Динамический элемент в XML  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
<WH><STOCK1 id="1"><DESCR>111111111111111111</DESCR></1STOCK><STOCK2 id="2"><DESCR>22222222222222222</DESCR></2STOCK></WH>

а ничего, что у вас невалидный xml?
8 сен 11, 14:29    [11247658]     Ответить | Цитировать Сообщить модератору
 Re: Динамический элемент в XML  [new]
vah
Member

Откуда:
Сообщений: 2694
Konst_One
<WH><STOCK1 id="1"><DESCR>111111111111111111</DESCR></1STOCK><STOCK2 id="2"><DESCR>22222222222222222</DESCR></2STOCK></WH>

а ничего, что у вас невалидный xml?


мне важен сам принцип формивания элементов

Такое реально?
8 сен 11, 14:34    [11247709]     Ответить | Цитировать Сообщить модератору
 Re: Динамический элемент в XML  [new]
Leran2002
Member

Откуда: Алматы, Казахстан
Сообщений: 53
Реально.

Вот, набросал на скорую руку:

DECLARE @X NVARCHAR(MAX);

SET @X=(
          SELECT CAST(ID AS NVARCHAR),DESCR,CAST(ID AS NVARCHAR)
          FROM SLV.STOCK FOR XML PATH('STOCK'),ROOT('WH')
       )

SET @X=REPLACE(@X,'<STOCK>','<STOCK')
SET @X=REPLACE(@X,'<DESCR>','><DESCR>')

SET @X=REPLACE(@X,'</STOCK>','STOCK>')
SET @X=REPLACE(@X,'</DESCR>','</DESCR></')


SELECT @X

Результат:
<WH>
<STOCK1><DESCR>111111111111111111</DESCR></1STOCK>
<STOCK2><DESCR>22222222222222222</DESCR></2STOCK>
</WH>

Думаю принцип понятен.
8 сен 11, 14:38    [11247748]     Ответить | Цитировать Сообщить модератору
 Re: Динамический элемент в XML  [new]
vah
Member

Откуда:
Сообщений: 2694
Leran2002
Реально.

Вот, набросал на скорую руку:

DECLARE @X NVARCHAR(MAX);

SET @X=(
          SELECT CAST(ID AS NVARCHAR),DESCR,CAST(ID AS NVARCHAR)
          FROM SLV.STOCK FOR XML PATH('STOCK'),ROOT('WH')
       )

SET @X=REPLACE(@X,'<STOCK>','<STOCK')
SET @X=REPLACE(@X,'<DESCR>','><DESCR>')

SET @X=REPLACE(@X,'</STOCK>','STOCK>')
SET @X=REPLACE(@X,'</DESCR>','</DESCR></')


SELECT @X

Результат:
<WH>
<STOCK1><DESCR>111111111111111111</DESCR></1STOCK>
<STOCK2><DESCR>22222222222222222</DESCR></2STOCK>
</WH>

Думаю принцип понятен.


Извращение конечно... А по-красивше никак?
8 сен 11, 14:44    [11247816]     Ответить | Цитировать Сообщить модератору
 Re: Динамический элемент в XML  [new]
Leran2002
Member

Откуда: Алматы, Казахстан
Сообщений: 53
Согласен, что извращение. ))
Но стандартно вроде такого не сделать.
Правильно формировать валидный XML используя, теги и атрибуты.

Правильней так:
DECLARE @X NVARCHAR(MAX);

SET @X=(
          SELECT ID,DESCR,ID
          FROM SLV.STOCK FOR XML PATH('STOCK'),ROOT('WH')
       )

-- избавляемся от тегов ID
SET @X=REPLACE(REPLACE(@X,'<ID>',''),'</ID>','')

-- формируем открывающий тег
SET @X=REPLACE(@X,'<STOCK>','<STOCK')
SET @X=REPLACE(@X,'<DESCR>','><DESCR>')

-- формируем закрывающий тег
SET @X=REPLACE(@X,'</STOCK>','>')
SET @X=REPLACE(@X,'</DESCR>','</DESCR></STOCK')

SELECT @X

В общем играя REPLACE’ми добиваетесь того что вам необходимо.
8 сен 11, 14:50    [11247893]     Ответить | Цитировать Сообщить модератору
 Re: Динамический элемент в XML  [new]
vah
Member

Откуда:
Сообщений: 2694
Leran2002
Согласен, что извращение. ))
Но стандартно вроде такого не сделать.
Правильно формировать валидный XML используя, теги и атрибуты.

Правильней так:
DECLARE @X NVARCHAR(MAX);

SET @X=(
          SELECT ID,DESCR,ID
          FROM SLV.STOCK FOR XML PATH('STOCK'),ROOT('WH')
       )

-- избавляемся от тегов ID
SET @X=REPLACE(REPLACE(@X,'<ID>',''),'</ID>','')

-- формируем открывающий тег
SET @X=REPLACE(@X,'<STOCK>','<STOCK')
SET @X=REPLACE(@X,'<DESCR>','><DESCR>')

-- формируем закрывающий тег
SET @X=REPLACE(@X,'</STOCK>','>')
SET @X=REPLACE(@X,'</DESCR>','</DESCR></STOCK')

SELECT @X

В общем играя REPLACE’ми добиваетесь того что вам необходимо.


Нее, я так не играю... )
8 сен 11, 14:54    [11247937]     Ответить | Цитировать Сообщить модератору
 Re: Динамический элемент в XML  [new]
iljy
Member

Откуда:
Сообщений: 8711
vah
Нее, я так не играю... )

А что вы хотели? Имена тегов и атрибутов для хмуля примерно как имена полей и талиц для скуля. Хотите задавать их динамически - формируйте динамические запросы.
8 сен 11, 16:06    [11248858]     Ответить | Цитировать Сообщить модератору
 Re: Динамический элемент в XML  [new]
iljy
Member

Откуда:
Сообщений: 8711
vah,

так красивше?
declare @x xml

declare @t table (id int, Descr varchar(100))
insert @t values(1,'1111111'),(2,'2222222')

set @x = (
	select * from(
		select '<WH>' union all
		select '<STOCK' + CAST(id as varchar) + '><DESCR>'+Descr + '</DESCR></STOCK' + CAST(id as varchar) + '>' from @t union all
		select '</WH>'
	) t(f1)
	for xml path(''), type
).value('.','nvarchar(max)')


select @x
8 сен 11, 16:15    [11248946]     Ответить | Цитировать Сообщить модератору
 Re: Динамический элемент в XML  [new]
Bdikin
Member

Откуда: Украина
Сообщений: 1
Leran2002
Согласен, что извращение. ))
Но стандартно вроде такого не сделать.
Правильно формировать валидный XML используя, теги и атрибуты.

Правильней так:
DECLARE @X NVARCHAR(MAX);

SET @X=(
          SELECT ID,DESCR,ID
          FROM SLV.STOCK FOR XML PATH('STOCK'),ROOT('WH')
       )

-- избавляемся от тегов ID
SET @X=REPLACE(REPLACE(@X,'<ID>',''),'</ID>','')

-- формируем открывающий тег
SET @X=REPLACE(@X,'<STOCK>','<STOCK')
SET @X=REPLACE(@X,'<DESCR>','><DESCR>')

-- формируем закрывающий тег
SET @X=REPLACE(@X,'</STOCK>','>')
SET @X=REPLACE(@X,'</DESCR>','</DESCR></STOCK')

SELECT @X

В общем играя REPLACE’ми добиваетесь того что вам необходимо.

Спасибо - как раз эта тема меня тоже интересовала
8 сен 11, 16:19    [11248994]     Ответить | Цитировать Сообщить модератору
 Re: Динамический элемент в XML  [new]
Leran2002
Member

Откуда: Алматы, Казахстан
Сообщений: 53
iljy
vah,

так красивше?
declare @x xml

declare @t table (id int, Descr varchar(100))
insert @t values(1,'1111111'),(2,'2222222')

set @x = (
	select * from(
		select '<WH>' union all
		select '<STOCK' + CAST(id as varchar) + '><DESCR>'+Descr + '</DESCR></STOCK' + CAST(id as varchar) + '>' from @t union all
		select '</WH>'
	) t(f1)
	for xml path(''), type
).value('.','nvarchar(max)')


select @x



О, так не стоит, опасно.
Т.к. если в данных (например в поле DESCR) будут спецсимволы XML (например, &, <, >, “, ‘) то будет либо ошибка, либо некорректный результат.
Эти символы в XML заменяются на:
& - &amp;
< - &lt;
> - &gt;
“ - &quot;
‘ - &apos;

Такое, например, не пройдет:
insert @t values(1,'11&11111'),(2,'2222222')
8 сен 11, 18:11    [11249963]     Ответить | Цитировать Сообщить модератору
 Re: Динамический элемент в XML  [new]
iljy
Member

Откуда:
Сообщений: 8711
Leran2002,

так хорошо?
declare @x xml

declare @t table (id int, Descr varchar(100))
insert @t values(1,'1111111'),(2,'2222222')
insert @t values(1,'11&11111'),(2,'2222222')

select @x = (
	select * from(
		select '<WH>' union all
		select '<STOCK' + CAST(id as varchar) + '>' + (select Descr for xml path('')) + '</STOCK' + CAST(id as varchar) + '>' from @t
		union all select '</WH>'
	)t(f1)
	for xml path(''),type
).value('.','nvarchar(max)')

select @x
8 сен 11, 18:41    [11250123]     Ответить | Цитировать Сообщить модератору
 Re: Динамический элемент в XML  [new]
Leran2002
Member

Откуда: Алматы, Казахстан
Сообщений: 53
iljy
Leran2002,

так хорошо?


Да, кратко и красиво! Молоток!
8 сен 11, 19:11    [11250253]     Ответить | Цитировать Сообщить модератору
 Re: Динамический элемент в XML  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
А может на клиете/"сервер аппликейшн" формировать XML?
10 сен 11, 12:35    [11258065]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить