MS SQL 2005 "على مسار XML" عقدة تخطيط سؤال
-
22-08-2019 - |
سؤال
ولدي الاستعلام التالي
Select field1 as 'node1/field1',
field2 as 'node1/field2',
(Select field3 as 'child1/field3',
field4 as 'child1/field4'
From table2
FOR XML PATH(''),TYPE,Elements)
From Table1 FOR XML PATH('Root'),Elements
وهذا ينتج:
<Root>
<node1>
<field1>data1</field1>
<field2>data2</field2>
</node1>
<child1>
<field3>data3</field3>
<field4>data4</field4>
</child1>
<child1>
...
</Root>
وأود العقد child1 لتكون جزءا من NODE1، وليس عقدة منفصلة أدناه.
<Root>
<node1>
<field1>data1</field1>
<field2>data2</field2>
<child1>
<field3>data3</field3>
<field4>data4</field4>
</child1>
<child1>
...
</node1>
<node1>
...
</Root>
ولقد حاولت وضع NODE1 في PATH فرعي
FOR XML PATH('node1'),TYPE,Elements)
وأو التقديم أسماء الحقول فرعي مع NODE1
Select field3 as 'node1/child1/field3',
ولكن كلا إنشاء عنصر NODE1 جديد لفرعي.
لا أحد يعرف كيف يمكن تحقيق ذلك؟
والشكر
المحلول
وأنت بلادي فلدى اقول SQL خادم كيف table1 و table2 هي ذات الصلة. وبناء على إجابتك أدناه، وأعتقد أن شيئا من هذا القبيل قد تفعل خدعة:
select
table1.field1 as 'Node1/Field1'
, table2.field1 as 'Node1/Child1/Field1'
, table1.field2 as 'Node2/Field2'
from table1
left join table2 on table1.id = table2.table1id
for xml PATH(''), ROOT('Root')
وهذا يجب أن ينتج XML مثل:
<Root>
<Node1>
<Field1>Value</Field1>
<Child1>
<Field1>Value</Field1>
</Child1>
</Node1>
<Node2>
<Field2>Value</Field2>
</Node2>
</Root>
نصائح أخرى
ولقد تكن قد فعلت الكثير من العمل مع T-SQL وFOR XML، لكني حصلت على جولة مشكلة مماثلة عن طريق استدعاء FOR XML جزءا من الاستعلام بعد كل الاستعلام الفرعي، على النحو التالي، واستخدام المعرف PATH لضبط العقد:
SELECT field1 as "Field1",
field2 as "Field2",
(select
field3 as "Field3",
field4 as "Field4"
from table2 t2 inner join
tlink tl on tl.id = t2.id inner join
table2 on t2.id = tl.id
group by field3, field4
FOR XML PATH ('Child'), type
)
from table2 t2
group by field1, field2
FOR XML PATH('Node'), ROOT('Root')
وهذا يعود:
<Root>
<Node1>
<Field1>data1</Field1>
<Field2>data2</Field2>
<Child1>
<Field3>data3</Field3>
<Field4>data4</Field4>
</Child1>
</Node1>
<Node2>
<Field1>data1.2</Field1>
<Field2>data2.2</Field2>
<Child2>
<Field3>data3.2</Field3>
<Field4>data4.2</Field4>
</Child2>
...
</Node2>
...
</Root>
وكما ذكر Andomar، كنت بحاجة للتأكد من وانضم البيانات بشكل صحيح.
ولقد حصلت أيضا على المجموعة حسب بند في لجعل البيانات على يقين لا "يضل". كنت أعاني من مشكلة في بيانات الاستعلام دون إجراء نسخ متماثل وهو طفل لكل إدخال في الاستعلام الخارجي (كانت هناك عدة أطفال تحت كل عقدة ذات الصلة لعدد العقد هناك.) أنا متأكد من أن هناك تفسير بسيط لكني لم اكن العمل على جدول زمني ضيق عندما فعلت ذلك وعاد أبدا للتحقق ...
وإذا كان هذا هو الاستخدام غير الصحيح أو أي شخص يمكن أن تلقي الضوء على مجموعات مكررة، يرجى الإشارة من ذلك وسوف تعديل ...
وكان لقائي الاول استعلام عينة ليس صحيحا تماما، كما أشرتم. هنا هو استعلام عينة أكثر دقة.
Select field1 as 'node1/field1',
field2 as 'node1/field2',
(Select field3 as 'child1/field3',
field4 as 'child1/field4'
From table2
Where table1.ID = table2.ID
FOR XML PATH(''),TYPE,Elements),
field5 as 'node2/field5',
field6 as 'node2/field6'
From table1 FOR XML PATH('Root'),Elements
والتي تنتج:
<Root>
<node1>
<field1>data1</field1>
<field2>data2</field2>
</node1>
<child1>
<field3>data3</field3>
<field4>data4</field4>
</child1>
<node2>
<field5>data5</field5>
<field6>data6</field6>
</node2>
</Root>
وfield5 وfield6 حقول من الاستعلام الخارجي، ولكن من خلال مختلف مسار العقدة، NODE2. هذا هو السبب في أنني لا يمكن أن يكون PATH ( 'العقدة') في الاستعلام الخارجي. وتستخدم حقول الاستعلام الخارجية في العديد من المسارات عقدة مختلفة تحت الجذر. أنا في حاجة إلى فرعي لرتان تحت NODE1، وهناك الاستعلامات الفرعية الأخرى التي تحتاج للعودة تحت NODE2، node3 ...
أنا متأكد من أن أكون أنا على صنع المعنى.
هذا هو أول وظيفة وسوف نتأكد من والرد على أفضل استعلام عينة في المرة القادمة.
وشكرا على الأجوبة.
وديرك
قد يكون أكثر منطقية إذا قمت بنشر بعض البيانات النموذجية بدلا من استخدام NODE1، field1 ومن child1 وغيرها، وشرح الجداول التي البيانات قادم من.
وXML الهرمية من الطبيعة. لا يمكنك بدء تعسفا العقد الجديدة التي لا تتصل العقد الأخرى تحت الجذر، وهو ما يبدو وكأنه كنت تحاول القيام به.
وكل شيء ضمن <node1>
..to..</node1>
تتعلق سجل واحد والبيانات التي تم إنشاؤها بواسطة الاستعلامات الفرعية. سوف تتابع العقدة المقبل تكرار هيكل كما <node2>
..to..</node2>
عن السجل التالي.
إذا كنت تريد المزيد من الاستفسارات الفرعية تحت كل عقدة ثم مجرد كتابة كل واحد في SQL مع FOR XML PATH('SubNodeName')
تلقاء نفسها
وأضف XSD الخاص بك أو عينة من رمز XML وسوف نرى ما اذا كان يمكنني العمل بها ما نحاول القيام به.