2017-02-07 27 views
1

xmlフィールド(SQL Server)では、ソーステーブルと条件に基づいて、すべてのサブノードにノードを追加する必要があります。 これは私のXMLデータである:すべての<name>についてはSQL ServerでXQueryを使用してxmlサブノードを変更する方法

declare @X table (XMLDATA xml) 
insert @X values(' 
<row> 
    <node> 
    <name>Francesco</name> 
    </name> 
    <node> 
    <label>Alessandro</name> 
    </node> 
    <node> 
    <name>Daniele</name> 
    </node> 
</row>') 

、私はノード<number>を追加します。表@Tで書かれている番号と名前の一致:

declare @T table (name varchar(20), number int) 
insert @T values 
('Alessandro', 24) 
,('Francesco', 10) 
,('Daniele', 16) 

私はXMLDATA.modifyを使用するノードを更新するには、と私は右のノードを選択するために、XPathの条件を使用します。

update @X set XMLDATA.modify('insert element number {sql:column("number")} as last into (row/node[name=sql:column("name")])[1]') 
from @X 
cross join @T 

作品上記のクエリ@T(この例ではAlessandro/24)の最初の行のみです。他の2行の@Tは無視されます。 nodenumberを追加する必要があります。

<row> 
    <node> 
    <name>Francesco</name> 
    </node> 
    <node> 
    <name>Alessandro</name> 
    <number>24</number> 
    </node> 
    <node> 
    <name>Daniele</name> 
    </node> 
</row> 
+0

Ronak Patelの回答が良い解決策(私が評価した)であっても、 'fieldxml.modify()'がどのように動作し、行内の多くのノードを更新するかを知りたいと思います。私が間違っていて、「正解」と表示されるのを助ける回避策ですか? – Radioleao

+0

有効なポイント...あなたのコメントの下にコメントしました*私は単にサンプルサブセット*を書きます(サンプルにあてはまる出力を追加してください)。これはあなたに正確な答えを与えるのに役立ちます。 – Shnugo

+0

私は、さまざまなレベルで何百ものノードがあると書いています。私はMSのSQL構文を尋ねる実際の例を投稿する必要がありますか? – Radioleao

答えて

1

私はwhileループを使用します。 これが最後のXMLDATAです。下記のコードを確認してください。役立つかもしれません。

declare @X table (XMLDATA xml) 
insert @X values(' 
<row> 
    <node> 
    <name>Alessandro</name> 
    </node> 
    <node> 
    <name>Francesco</name> 
    </node> 
    <node> 
    <name>Daniele</name> 
    </node> 
</row>') 


declare @T table (name1 varchar(20), number int,RowID int identity(1,1) not null) 
insert @T values 
('Alessandro', 24) 
,('Francesco', 10) 
,('Daniele', 16) 

DECLARE @i int,@iCount int,@namevalue varchar(100)='',@number int 
SET @i = 1 


SELECT @iCount=MAX(RowID) FROM @T 

WHILE (@i <= @iCount) 
BEGIN 

SELECT @namevalue=name1 FROM @T WHERE [email protected] 
SELECT @number=number FROM @T WHERE [email protected] 

update @X set XMLDATA.modify('insert element number {sql:variable("@number")} as last into (row/node)[name=sql:variable("@namevalue")][1]') 
from @X 
cross join @T 

    SET @i = @i + 1 
END 

SELECT * FROM @X 

出力:

<row> 
    <node> 
    <name>Alessandro</name> 
    <number>24</number> 
    </node> 
    <node> 
    <name>Francesco</name> 
    <number>10</number> 
    </node> 
    <node> 
    <name>Daniele</name> 
    <number>16</number> 
    </node> 
</row> 

感謝。

+0

これは良い解決策です。私はループの代わりにカーソルを使用するとさらに好きです。ループを使用せずに適切な更新クエリを検索したいのですが、適切な回避策です。ありがとう – Radioleao

+0

これは私が得た最高のソリューションです。私はいくつかの異なる構文をサブノードで管理することを期待していましたが、私は恐れています – Radioleao

0

あなたの実際の生活のデータは一例と同様に簡単である場合は、解決策をはるかに簡単に見つけることができます:

declare @X table (XMLDATA xml) 
insert @X values(
'<row> 
    <node> 
    <name>Francesco</name> 
    </node> 
    <node> 
    <name>Alessandro</name> 
    </node> 
    <node> 
    <name>Daniele</name> 
    </node> 
</row>') 

declare @T table (name varchar(20), number int) 
insert @T values 
('Alessandro', 24) 
,('Francesco', 10) 
,('Daniele', 16); 

SELECT nm.value(N'.','nvarchar(max)') AS name 
     ,t.number 
FROM @X 
CROSS APPLY XMLDATA.nodes(N'/row/node/name') AS A(nm) 
INNER JOIN @T AS t ON t.name=nm.value(N'.','nvarchar(max)') 
FOR XML PATH('node'),ROOT('row') 

これはあなたのために動作しない場合は、より現実的なサンプルデータを提供してください!

+0

私は何百ものノードと多くのサブノードを持っています。私は、可能な限り明確になるように、サンプルサブセットを書くだけです。 – Radioleao

関連する問題