SQL خادم 2005 تحديد لمسار XML مع الاتحاد في مشكلة فرعية الانتخاب

StackOverflow https://stackoverflow.com/questions/2056862

سؤال

وأنا ليس من ذوي الخبرة مع خادم SQL "تحديد للمسار 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>

في بلدي نتيجة لهذا (جزء من أكبر) بيان أنا في حاجة إلى keyfield 2ND أيضا:

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

وهكذا لقد غيرت بلدي (دون) الاستعلام مع الاتحاد حدد ل:

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 النتائج مسار ساحرة في عناصر متعددة. لكنني لا أفهم لماذا هذا لا يمكن القيام به مع الاتحاد.

ويمكن للشخص ضعني في الاتجاه الصحيح كيفية accomplisch وXML مع keyfields 2 في بلدي الاستعلام (الفرعية)؟

وثنإكس جزيلا لك.

هل كانت مفيدة؟

المحلول

والمشكلة مع subselect الخاص بك هو أن الجزء الأول لا يشير إلى أي جدول على الإطلاق (لا FROM-clause).

وهذا جدولة يعطيني الإخراج الذي طلب:

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')

نصائح أخرى

وهنا مثال مبسط، ولكن هل هذا تحصل على ما تحتاج إليه؟

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')
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top