2009-03-08 4 views
4

この問題の背景を説明するために、現在、いくつかの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' 

私はそれが可能かどうかはわかりませんが、私はさまざまな構文を試して、働くことができません。

問題への任意の他のアプローチも感謝あなたは自分の選択で固定テキストとして「「」/」を追加できませんでした

答えて

5

は、ここに自分の質問に答えます!

私は現在、XQueryは、クエリで構築FLWOR に探しています: - これは私が言った他未遂の答えの一つに、コメントに続くもの。
col.query('for $item in * return <Item> {$item} </item>')がほとんど ですが、周りの私は構文で、ほとんどがあったすべてのノード

を 周りの各ノードを置くのではなく、小さな微調整は私が必要なものを私に与えています。

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

お手数をおかけしていただきありがとうございます。さらに関連する問題がありますが、別の質問として投稿します。

0

を受けましたか?以下のような何か:

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) 

マルク・

+0

申し訳ありませんが、これはうまくいきません。私はあなたが意味することは同様に '' + doc.col.query( '*')+ 'となると思います。を別々の列として選択しています。 xml私はdoc.col.query( '*')の結果として取得します。 – DannykPowell

+0

また、これを行うには、xmlをvarcharに変換する必要があります。 – DannykPowell

+0

さらに、xmlをvarchar(max)に変換しようとしましたが、照合の競合が発生しました - xmlの一部の文字(nvarcharも試しました)のために考えています – DannykPowell

8

私はあなたがFOR句を使用して、ルートノード名をspecifiyすることができます信じ。例えば

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

は、詳細については、オンラインブックを見てください:

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

+0

私はこれを実験しましたが、私のクエリでどのように動作するのか分かりません。これをどのように使用するかの例を挙げることはできますか? 選択..... doc.col.query( '*') FROM @ xml.nodes( '// Items/Item')doc(col) クエリ? – DannykPowell

+0

FOR XML句はINSERT文では使用できません。 – DannykPowell

関連する問題