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

Откуда:
Сообщений: 45
есть таблица
    create table dbo.Contacts (
         Id bigint PRIMARY KEY
        ,TypeId bigint
        ,Value nvarchar(MAX)
        ,ValueFormat nvarchar(32)
        ,ZoneCode nvarchar(8)
    )

Из нее необходимо сделать выборку в XML, так, что бы название элемента зависело от поля StatusId как-то вот так.
<Contacts>
    <Phone Value="111111" ValueFormat="0-000-000-00-00" TypeId="1" />
    <Fax Value="2222222" ValueFormat="0-000-000-00-00" TypeId="2" />
    <Phone Value="3333333" ValueFormat="0-000-000-00-00" TypeId="1" />
    <Phone Value="4444444" ValueFormat="0-000-000-00-00" TypeId="1" />
    <Fax Value="555555" ValueFormat="0-000-000-00-00" TypeId="2" />
</Contacts>

Соответственно, запрос вида
SELECT
     Contact.*
FROM dbo.Contacts as Contact
WHERE Contact.GroupId = [Card].GroupId
ORDER BY Contact.OrderNo
FOR XML AUTO, TYPE

Не очень помогает. Подскажите.
20 фев 12, 05:26    [12119872]     Ответить | Цитировать Сообщить модератору
 Re: Выборка в XML элементов, имеющих разные имена  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Backs
название элемента зависело от поля StatusId
И где это поле в таблице(ах)?
Backs
как-то вот так.
    <Phone Value="111111" ValueFormat="0-000-000-00-00" TypeId="1" />
Маразм крепчал.

Чем отличается хороший сотрудник от плохого.
Плохой исполняет все глупости регламента. Хороший подправляет сам регламент под сдравый смысл.
20 фев 12, 11:04    [12120616]     Ответить | Цитировать Сообщить модератору
 Re: Выборка в XML элементов, имеющих разные имена  [new]
megavolt
Member

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

DECLARE @X XML = '
<Contacts>
    <Phone Value="111111" ValueFormat="0-000-000-00-00" TypeId="1" />
    <Fax Value="2222222" ValueFormat="0-000-000-00-00" TypeId="2" />
    <Phone Value="3333333" ValueFormat="0-000-000-00-00" TypeId="1" />
    <Phone Value="4444444" ValueFormat="0-000-000-00-00" TypeId="1" />
    <Fax Value="555555" ValueFormat="0-000-000-00-00" TypeId="2" />
</Contacts>'

SELECT T.X.value('@Value', 'varchar(15)') 
FROM @X.nodes('/Contacts[1]/Phone') T(X)
UNION ALL 
SELECT T.X.value('@Value', 'varchar(15)') 
FROM @X.nodes('/Contacts[1]/Fax') T(X)
20 фев 12, 13:55    [12122488]     Ответить | Цитировать Сообщить модератору
 Re: Выборка в XML элементов, имеющих разные имена  [new]
megavolt
Member

Откуда: Москва
Сообщений: 52
даже проще, я ступил:

DECLARE @X XML = '
<Contacts>
    <Phone Value="111111" ValueFormat="0-000-000-00-00" TypeId="1" />
    <Fax Value="2222222" ValueFormat="0-000-000-00-00" TypeId="2" />
    <Phone Value="3333333" ValueFormat="0-000-000-00-00" TypeId="1" />
    <Phone Value="4444444" ValueFormat="0-000-000-00-00" TypeId="1" />
    <Fax Value="555555" ValueFormat="0-000-000-00-00" TypeId="2" />
</Contacts>'

SELECT T.X.value('@Value', 'varchar(15)') 
FROM @X.nodes('/Contacts[1]/*') T(X)
20 фев 12, 13:56    [12122508]     Ответить | Цитировать Сообщить модератору
 Re: Выборка в XML элементов, имеющих разные имена  [new]
iljy
Member

Откуда:
Сообщений: 8711
megavolt
даже проще, я ступил:

и не один раз - задача обратная.
20 фев 12, 13:58    [12122527]     Ответить | Цитировать Сообщить модератору
 Re: Выборка в XML элементов, имеющих разные имена  [new]
iljy
Member

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

 declare @t table (
		TypeId bigint
        ,Value nvarchar(MAX)
        ,ValueFormat nvarchar(32)
    )
declare @x xml ='<Contacts>
    <Phone Value="111111" ValueFormat="0-000-000-00-00" TypeId="1" />
    <Fax Value="2222222" ValueFormat="0-000-000-00-00" TypeId="2" />
    <Phone Value="3333333" ValueFormat="0-000-000-00-00" TypeId="1" />
    <Phone Value="4444444" ValueFormat="0-000-000-00-00" TypeId="1" />
    <Fax Value="555555" ValueFormat="0-000-000-00-00" TypeId="2" />
</Contacts>'

insert @t
select n.value('@TypeId','int'), n.value('@Value','nvarchar(max)'),
	n.value('@ValueFormat','nvarchar(32)')
from @x.nodes('/Contacts/*') t(n)

select case TypeId when 1 then TypeId end 'Phone/@TypeId',
		case TypeId when 1 then Value end 'Phone/@Value',
		case TypeId when 2 then TypeId end 'Fax/@TypeId',
		case TypeId when 2 then Value end 'Fax/@Value'
from @t
for xml path(''),root('Contacts')
20 фев 12, 14:08    [12122651]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить