5

単一の select ステートメントから作成された @XML ドキュメントがあります。

<root>
 <node>
  <node1>
   <targetNode>
   </targetNode>
  </node1>
  <node1>
   <targetNode>
   </targetNode>
  </node1>
  <node1>
   <targetNode>
   </targetNode>
  </node1>
 </node>
 <node>
  ......
 </node>
</root>

このドキュメントの「targetNode」の属性として xsi:nil を挿入したいと考えています。

@XML.modify( 'insert attribute xsi:nil {"true"} into (root/node/node1/targetNode) [1]') 

上記は、属性を @XML ドキュメント内の targetNode の最初のオカレンスに挿入します。ただし、挿入ステートメントは単一のノードでのみ機能します。この属性を @XML ドキュメントの targetNode のすべてのインスタンスに挿入する方法はありますか。

4

3 に答える 3

5

複数のノードでの DML 操作で シンプルでエレガントなソリューションを見つけましたhttp://blogs.msdn.com/b/denisruc/archive/2005/09/19/471562.aspx

アイデアは、ノードの数を数えて、それらを 1 つずつ変更することです。

DECLARE @iCount int
SET @iCount = @var.value('count(root/node/node1/targetNode)','int')

DECLARE @i int
SET @i = 1

WHILE (@i <= @iCount)
BEGIN
   @xml.modify('insert attribute xsi:nil {"true"} into (root/node/node1/targetNode)[sql:variable("@i")][1]')
   SET @i = @i + 1
END
于 2013-03-25T15:34:43.897 に答える
2

これは、変更機能では不可能です。単一のノードでのみ機能します。

XML の実際の構造によっては、文字列として操作できますが、これは明らかに見苦しく、場合によっては間違っている可能性があります。

このような:

declare @xml as xml
set @xml = '<root>
 <node>
  <node1>
   <targetNode>
   </targetNode>
  </node1>
  <node1>
   <targetNode>
   </targetNode>
  </node1>
  <node1>
   <targetNode>
   </targetNode>
  </node1>
 </node>
</root>
'

set @xml = replace(cast(@xml as nvarchar(max)), '<targetNode/>', '<targetNode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true" />')
select @xml
于 2009-02-11T13:34:38.750 に答える