SQL Server XML-DML comment replace la valeur de l'élément par la valeur de xpath relatif

J'ai une colonne xml avec datatables suivantes:

<Policy> <Name> <Id>adf</Id> <First>Alan</First> <Last>Turing</Last> </Name> <Name> <Id>asdf</Id> <Business>Vandelay Indussortinges</Business> </Name> <Name> <Id>asdf</Id> <First>Dennis</First> <Last>Ritchie</Last> </Name> </Policy> 

Comment écrirais-je une requête XML-DML qui replacea la valeur de l'élément Id pour chaque nom sur toutes les lignes afin qu'il contienne la valeur de First, Last et Business. Par exemple:

 <Policy> <Name> <Id>AlanTuring</Id> <First>Alan</First> <Last>Turing</Last> </Name> <Name> <Id>Vandelay Indussortinges</Id> <Business>Vandelay Indussortinges</Business> </Name> <Name> <Id>DennisRitchie</Id> <First>Dennis</First> <Last>Ritchie</Last> </Name> </Policy> 

Voici ma tentative ratée:

 update policy set data.modify(' replace value of (//Name/Id/text())[1] with concat( (//Name/First/text())[1], (//Name/Last/text())[1], (//Name/Business/text())[1])') 

Qui produit ce qui suit:

 <Policy> <Name> <Id>AlanTuringVandelay Indussortinges</Id> <First>Alan</First> <Last>Turing</Last> </Name> <Name> <Id>asdf</Id> <Business>Vandelay Indussortinges</Business> </Name> <Name> <Id>asdf</Id> <First>Dennis</First> <Last>Ritchie</Last> </Name> </Policy> 

Cela marche.

 declare @i int declare @maxNames int set @i = 1 set @maxNames = (select max(data.value('count(//Name)', 'int')) from Policy) while @i <= @maxNames begin update policy set data.modify(' replace value of (//Name[sql:variable("@i")]/Id/text())[1] with concat( (//Name[sql:variable("@i")]/First/text())[1], (//Name[sql:variable("@i")]/Last/text())[1], (//Name[sql:variable("@i")]/Business/text())[1]) ') set @i = @i + 1 end 

Une option basée sur un set serait celle-ci:

  update policy set data.modify(' replace value of (//Name[sql:column("id")]/Id/text())[1] with concat( (//Name[sql:column("id")]/First/text())[1], (//Name[sql:column("id")]/Last/text())[1], (//Name[sql:column("id")]/Business/text())[1]) ')