سؤال

ولدي الاستعلام التالي

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 وسوف نرى ما اذا كان يمكنني العمل بها ما نحاول القيام به.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top