最初にこの問題の背景を説明するために、現在いくつかの xml をループしているコードを書き直し、各ループの最後にテーブルへの挿入を行っています。行って、xml をテーブルに「細断」します。
メインのシュレッドは正常に実行されましたが、現在、ノード全体を格納するために列の 1 つが使用されています。これに必要なクエリを (ほぼ) 作成することができましたが、ノードのルート部分を見逃しています。私は、自分のクエリが取得できる限り優れているという結論に達しました。その後、更新ステートメントを実行してルート ノードをそこに戻す方法を検討しています。
したがって、私の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>
したがって、基本的なシュレッディングでは、ノード 1 の値が列 1 に、ノード 2 が列 2 に、というように挿入されます。insert ステートメントは次のようになります。
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)
wholenodecolumn で終わる XML の形式は次のとおりです。
<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 * ')
それは問題ありませんが、XMLが無効になるため、一度に1つずつ実行することはオプションではありません
XQuery [mytable.wholenodecolumn.modify()]: Expected end tag 'Item'
両方を一緒に行うことが可能かどうかはわかりませんが、さまざまな構文を試しましたが、うまくいきません。
問題への他のアプローチも感謝して受け取りました