SQL Server 2005 выбрать для пути XML с объединением в проблеме подвыбора - PullRequest
0 голосов
/ 13 января 2010

У меня довольно большой опыт работы с запросами SQL Server «выбрать путь XML», но теперь я столкнулся со странной проблемой.

Следующий запрос работает нормально:

select 
(
     select
     'Keyfield1' as "@Name",
    t1.Keyfield1 as "Value"
    from MyTable t1
    where 
    t1.KeyField1= t2.KeyField1 and
    t1.KeyField2= t2.KeyField2
    for xml path('Field'),type, elements 
) as 'Key'
from MyTable t2
for XML path('Path') , elements XSINIL, root('Root')

Это приведет (для фиктивного набора данных) к следующему XML:

<Root>  
  <Path>
    <Key Name="KeyField1">
      <Value>DummyValue1</Value>
    </Key>
  </Path>
</Root>

В моем результате этого (часть большего) утверждения мне также нужно второе ключевое поле:

<Root>  
  <Path>
    <Key Name="KeyField1">
      <Value>DummyValue1</Value>
    </Key>
    <Key Name="KeyField2">
      <Value>DummyValue2</Value>
    </Key>
  </Path>
</Root>

Поэтому я изменил свой (под) запрос с помощью union-select на:

select 
(
     select
     'Keyfield1' as "@Name",
    t1.Keyfield1 as "Value"
     union all
     select
     'Keyfield2' as "@Name",
    t1.Keyfield2 as "Value"
    from MyTable t1
    where 
    t1.KeyField1= t2.KeyField1 and
    t1.KeyField2= t2.KeyField2
    for xml path('Field'),type, elements 
) as 'Key'
from MyTable t2
for XML path('Path') , elements XSINIL, root('Root')

Но теперь я получаю сообщение об ошибке "В списке выбора можно указать только одно выражение, когда подзапрос не введен с EXISTS."

Я знаю, что в подзапросе может быть несколько записей, для которых путь XML приводит к нескольким элементам. Но я не понимаю, почему это не может быть сделано с помощью союза.

Может ли кто-нибудь указать мне правильное направление, как выполнить XML с помощью двух ключевых полей в моем (под) запросе?

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 13 января 2010

Проблема с вашим подвыбором заключается в том, что первая часть вообще не ссылается на какую-либо таблицу (нет условия FROM-).

Этот список дает мне запрошенный вывод:

declare @mytable table (
keyfield1 nvarchar(20),
keyfield2 nvarchar(20)
)

insert into @mytable values ('Dummyvalue1', 'Dummyvalue2')
select * from @mytable

select 
(
     select
     'Keyfield1' as "@Name",
    t1.Keyfield1 as "Value"
    from @mytable t1
    where 
    t1.KeyField1= t2.KeyField1 and
    t1.KeyField2= t2.KeyField2
    for xml path('Field'),type, elements 
) as 'Key'
from @mytable t2
for XML path('Path') , elements XSINIL, root('Root')


select 
(
    select * from (
      select
     'Keyfield1' as "@Name",
    t1.Keyfield1 as "Value"
    from @MyTable t1
    where 
    t1.KeyField1= t2.KeyField1
     union all
     select
     'Keyfield2' as "@Name",
    t3.Keyfield2 as "Value"
    from @MyTable t3
    where 
    t3.KeyField2= t2.KeyField2) a
    for xml path('Field'),type, elements 
) as 'Key'
from @MyTable t2
for XML path('Path') , elements XSINIL, root('Root')
0 голосов
/ 22 января 2010

Вот упрощенный пример, но дает ли это то, что вам нужно?

select 
    (
        select
            'Keyfield1' as "@Name",
            'Blah' as "Value"
        for xml path('Key'),type, elements 
    ),
    (
        select
            'Keyfield2' as "@Name",
            'Blah' as "Value"
        for xml path('Key'),type, elements 
    )
for XML path('Path') , elements XSINIL, root('Root')
...