2

次のデータを含む xml 列があります。

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

First、Last、および Business の値が含まれるように、すべての行の各 Name の Id 要素の値を置き換える XML-DML クエリを作成するにはどうすればよいでしょうか。例えば:

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

これが私の失敗した試みです:

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])') 

これにより、次のものが生成されます。

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

2 に答える 2

3

これは機能します。

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
于 2012-01-20T15:54:26.950 に答える
1

セットベースのオプションは次のとおりです。

    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])
    ') 
于 2015-11-23T22:43:08.990 に答える