【问题标题】:SQL Server XML-DML how to replace element value with value of relative xpathSQL Server XML-DML如何用相对xpath的值替换元素值
【发布时间】:2012-01-20 15:13:57
【问题描述】:

我有一个包含以下数据的 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>

我将如何编写一个 XML-DML 查询来替换所有行中每个 Name 的 Id 元素的值,使其包含 First、Last 和 Business 的值。例如:

<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>

【问题讨论】:

    标签: sql sql-server xml xpath xml-dml


    【解决方案1】:

    这行得通。

    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
    

    【讨论】:

      【解决方案2】:

      一个基于集合的选项是这个:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-03
        • 1970-01-01
        • 1970-01-01
        • 2015-07-15
        • 1970-01-01
        • 1970-01-01
        • 2022-01-11
        相关资源
        最近更新 更多