سؤال

لإعطاء بعض الخلفية لهذه المشكلة أولاً ، أقوم بإعادة كتابة بعض التعليمات البرمجية التي تحلق حاليًا عبر XML ، وأقوم بإدراج إلى جدول في نهاية كل حلقة - استبدال SP واحد يأخذ معلمة XML ويقوم بإدراج في واحدة اذهب ، "تمزيق" XML في جدول.

تم تنفيذ Main Red بنجاح ، ولكن يتم استخدام أحد الأعمدة حاليًا لتخزين العقدة بأكملها. لقد تمكنت من حل الاستعلام اللازم لهذا (تقريبًا) ، لكنه يفتقد الجزء الجذر للعقدة. لقد توصلت إلى استنتاج مفاده أن استعلامي جيد قدر استطاعتي ، وأنا أبحث في طريقة لإجراء بيان تحديث لإعادة عقدة الجذر إلى هناك.

لذا فإن XML الخاص بي هو الشكل ؛

<xml>
<Items>
<Item>
    <node1>...</node1><node2>..<node2>.....<noden>...<noden>
<Item>
<Item>
    <node1>...</node1><node2>..<node2>.....<noden>...<noden>
<Item>
<Item>
    <node1>...</node1><node2>..<node2>.....<noden>...<noden>
<Item>
......
<Items>
</xml>

وبالتالي فإن التمزيق الأساسي يضع القيمة من Node1 إلى العمود 1 ، Node2 في العمود 2 إلخ. يبدو عبارة الإدراج مثل ؛

INSERT INTO mytable col1, col2,...etc.....,wholenodecolumn
Select  
doc.col.value('node1[1]', 'int') column1,
doc.col.value('node2[1]', 'varchar(50)') column2,
....etc......,
doc.col.query('*')--this is the query for getting the whole node
FROM @xml.nodes('//Items/Item') doc(col)

XML الذي ينتهي في wholenodecolumn هو الشكل ؛

<node1>...</node1><node2>..<node2>.....<noden>...<noden>

لكني بحاجة إلى أن تكون من النموذج

<Item><node1>...</node1><node2>..<node2>.....<noden>...<noden></Item>

يوجد رمز موجود (الكثير منه) يعتمد على XML في هذا العمود من النموذج الصحيح.

لذلك يمكن لأي شخص أن يرى كيفية تعديل doc.col.query('*') للحصول على النتيجة المرجوة؟

على أي حال ، لقد تخليت عن تعديل الاستعلام ، وحاولت التفكير في طرق أخرى لإنجاز النتيجة النهائية. ما أبحث عنه الآن هو تحديث بعد الإدراج- شيء مثل ؛

update mytable set wholenodecolumn.modify('insert <Item> as first before * ')

إذا كان بإمكاني القيام بذلك مع

 .modify('insert </Item> as last after * ')  

سيكون ذلك جيدًا ، لكن القيام 1 في وقت واحد ليس خيارًا لأن XML غير صالح في ذلك الوقت

XQuery [mytable.wholenodecolumn.modify()]: Expected end tag 'Item'  

والقيام كلاهما معًا ، لا أعرف ما إذا كان ذلك ممكنًا ولكني جربت مختلف بناء الجملة ولا يمكنني العمل.

أي مقاربات أخرى للمشكلة التي تم تلقيها بامتنان أيضًا

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

المحلول 2

الإجابة على سؤالي هنا! - يتبع ذلك من التعليقات إلى واحدة من الإجابات الأخرى التي قلت:

أنا أبحث حاليًا في بنيات Flwor Xquery في الاستعلام.
col.query('for $item in * return <Item> {$item} </item>') هناك تقريبًا ، ولكن يضع حول كل عقدة ، وليس حول جميع العقد

كنت هناك تقريبًا مع بناء الجملة ، أعطاني قرص صغير ما أحتاجه ؛

doc.col.query('<Item> { for $item in * return $item } </item>'

شكرا لكل من ساعد. لدي المزيد من المشكلات ذات الصلة الآن لكنني سأقوم بنشر أسئلة منفصلة

نصائح أخرى

أنا أعتقد أنه يمكنك تحديد اسم عقدة الجذر باستخدام الجملة لـ FOR.

فمثلا:

select top 1 *
from HumanResources.Department
for XML AUTO, ROOT('RootNodeName')

ألقِ نظرة على الكتب عبر الإنترنت لمزيد من التفاصيل:

http://msdn.microsoft.com/en-us/library/ms190922.aspx

ألا يمكنك فقط إضافة "" / "كنصوص ثابتة في SELECT؟ شيء مثل:

Select  
  '<Item>',
  doc.col.value('node1[1]', 'int') column1,
  doc.col.value('node2[1]', 'varchar(50)') column2,
  ....etc......,
  doc.col.query('*'),
  '</Item>'      --this is the query for getting the whole node
FROM @xml.nodes('//Items/Item') doc(col)

مارك

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