SQL خادم 2005 تحديد لمسار XML مع الاتحاد في مشكلة فرعية الانتخاب
-
20-09-2019 - |
سؤال
وأنا ليس من ذوي الخبرة مع خادم 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')