6

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

両方を一緒に行うことが可能かどうかはわかりませんが、さまざまな構文を試しましたが、うまくいきません。

問題への他のアプローチも感謝して受け取りました

4

3 に答える 3

7

FOR句を使用してルートノード名を指定できると思います。

例えば:

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

詳細については、オンラインの本をご覧ください。

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

于 2009-03-08T21:29:51.040 に答える
7

ここで私自身の質問に答えます!-これは、コメントから、私が言った他の試行された回答の1つに続きます。

現在、クエリで FLWOR Xquery 構造を調べています。
col.query('for $item in * return <Item> {$item} </item>') ほぼそこにありますが、すべてのノードの周りではなく、各ノードの周りに配置します

私は構文でほとんどそこにいました。小さな微調整で必要なものが得られました。

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

助けてくれたみんなに感謝します。現在、さらに関連する問題がありますが、別の質問として投稿します

于 2009-03-09T14:19:29.367 に答える
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)

マーク

于 2009-03-08T21:23:44.317 に答える