Frage

Um zuerst einen Hintergrund für dieses Problem zu geben, schreibe ich einen Code neu, der derzeit einige XML durchschlägt, ein Einsatz in eine Tabelle am Ende jeder Schleife - ersetzt durch einen einzelnen SP, der einen XML -Parameter benötigt und das Einfügen in einem durchführt Gehen Sie das XML in einen Tisch.

Der Hauptfisch wurde erfolgreich durchgeführt, aber derzeit wird eine der Spalten verwendet, um den gesamten Knoten zu speichern. Ich konnte die für diese (fast) erforderliche Abfrage herausarbeiten, aber es verfehlt den Wurzelteil des Knotens. Ich bin zu dem Schluss gekommen, dass meine Abfrage so gut wie möglich ist, und ich schaue auf einen Weg, um dann eine Update -Anweisung vorzunehmen, um den Stammknoten wieder hineinzubringen.

Also ist mein XML von der Form;

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

Daher stellt das Basic Shredding den Wert vom Knoten1 in Spalte1, Node2 in Spalte2 ein. Die Anweisung Insert sieht ungefähr aus.

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)

Die XML, die in Vollkornodekolumn endet, ist von der Form;

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

Aber ich muss es von der Form sein

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

Es gibt vorhandenes Code (viel davon), der von der XML in dieser Spalte abhängt.

Kann jemand vielleicht sehen, wie man das modifiziert doc.col.query('*') Um das gewünschte Ergebnis zu erzielen?

Wie auch immer, ich gab es auf, die Abfrage zu ändern, und versuchte, über andere Möglichkeiten nachzudenken, um das Endergebnis zu erreichen. Was ich jetzt betrachte, ist ein Update nach dem Einfügen- so etwas wie;

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

Wenn ich das zusammen mit tun könnte

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

Das wäre in Ordnung, aber 1 gleichzeitig ist es keine Option, da der XML dann ungültig ist

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

Und beides zusammen weiß ich nicht, ob es möglich ist, aber ich habe verschiedene Syntax ausprobiert und kann mich nicht zur Arbeit machen.

Alle anderen Ansätze für das Problem erhielten auch dankbar auch dankbar

War es hilfreich?

Lösung 2

Beantwortung meiner eigenen Frage hier! - Dies folgt aus den Kommentaren zu einem der anderen versuchten Antworten, in denen ich sagte:

Ich suche derzeit in der Abfrage mit FLWOR XQuery -Konstrukten.
col.query('for $item in * return <Item> {$item} </item>') ist fast da, legt aber jeden Knoten und nicht um alle Knoten um

Ich war fast mit der Syntax da, ein kleiner Verbesserung hat mir gegeben, was ich brauchte;

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

Vielen Dank an alle, die geholfen haben. Ich habe jetzt weitere verwandte Probleme, aber ich werde als separate Fragen posten

Andere Tipps

Ich glaube, Sie können den Stammknotennamen mithilfe der für die Klausel angeben.

Zum Beispiel:

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

Schauen Sie sich Bücher online an, um weitere Informationen zu erhalten:

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

Couldn't you just add the '' / '' as fixed texts in your select? Something like:

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)

Marc

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top