この問題の背景を説明するために、現在、いくつかのXMLをループしているコードを書き直しています。 1つのspはxmlパラメータを受け取り、1つの挿入を行い、xmlをテーブルにシュレッドします。SQLサーバーで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>
だから、基本的な破砕は、INSERT文のようなものに見えるCOLUMN2などにノード2、COLUMN1にノード1から値を置きます。
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>
が、私は、正しい形式のこのコラムであることに、XMLに依存して既存のコード(その多くが)があり、それはフォームの
<Item><node1>...</node1><node2>..<node2>.....<noden>...<noden></Item>
する必要があります。
誰かがdoc.col.query('*')
を変更して希望の結果を得る方法を知ることができますか?
とにかく、私はクエリの変更を断念し、最終結果を達成するための他の方法について考えようとしました。私が今見ているのは、挿入の後の更新です。
update mytable set wholenodecolumn.modify('insert <Item> as first before * ')
私は、XMLはその後、無効であるとして罰金が、一度に1をやってすることはオプションではありませんでしょう
.modify('insert </Item> as last after * ')
と一緒にこれを行うことができれば
XQuery [mytable.wholenodecolumn.modify()]: Expected end tag 'Item'
私はそれが可能かどうかはわかりませんが、私はさまざまな構文を試して、働くことができません。
問題への任意の他のアプローチも感謝あなたは自分の選択で固定テキストとして「「」/」を追加できませんでした
申し訳ありませんが、これはうまくいきません。私はあなたが意味することは同様に '- ' + doc.col.query( '*')+ '
となると思います。- と
を別々の列として選択しています。 xml私はdoc.col.query( '*')の結果として取得します。 –
DannykPowell
また、これを行うには、xmlをvarcharに変換する必要があります。 – DannykPowell
さらに、xmlをvarchar(max)に変換しようとしましたが、照合の競合が発生しました - xmlの一部の文字(nvarcharも試しました)のために考えています – DannykPowell