SQL ServerでXMLを変更してルートノードを追加する
-
05-07-2019 - |
質問
最初にこの問題の背景を説明するために、現在いくつかのxmlをループするコードを書き直し、各ループの最後にテーブルへの挿入を行います-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>
したがって、基本的な細断処理では、node1からcolumn1、node2からcolumn2などに値が挿入されます。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'
両方を一緒に行うと、それが可能かどうかわかりませんが、さまざまな構文を試しましたが、機能しません。
問題に対する他のアプローチもありがたいことに受けた
解決 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')
詳細については、オンラインの書籍をご覧ください:
「/」を固定テキストとして選択に追加しませんでしたか?次のようなもの:
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)
マーク