首页 > 解决方案 > 更新多个节点的 XML 数据

问题描述

我想根据所选计划更新 Isselected 计划数据

            SET @DataXml.modify(' replace value of (/*/Plans/Plan[sql:variable("@PlanID")]/Details/IsSelected/text())[1] with sql:variable("IsSelectedValue")') 

但上面的查询总是更新第一个。

<Plans>
        <Plan>
          <Details>
               <IsSelected>true</IsSelected>
         </Details>  
        </plan> 
        <Plan>
          <Details>
                 <IsSelected>false</IsSelected>
         </Details>  
        </plan> 
        <Plan>
          <Details>
                <IsSelected>false</IsSelected>
         </Details>  
        </plan>
  </Plans>


if((SELECT count(Col.value('(Details)[1]', 'nvarchar(max)')) AS Selected FROM @DataXml.nodes('Options/Option') AS Tbl(Col)) > 1)
                                BEGIN                   

                                    SET @DataXml.modify(' replace value of (/*/Options/Option[sql:variable("@OptionID")]/Details/IsSelectedValue/text())[1] with sql:variable("@IsSelectedValue")')
                                END
                            ELSE
                            BEGIN                            

                                    SET @DataXml.modify(' replace value of (/*/Options/Option/Details/IsSelectedValue/text())[1] with sql:variable("@IsSelectedValue")')
                            END

如果我可以像上面的数据一样获得节点计数,它应该返回计数 3,我可以设法解决这个问题。

标签: sql-serverxmlsql-server-2008

解决方案


这个答案可能为时已晚......但它可能仍然有帮助......

我必须承认,我没有完全理解你的问题。试试这个:

样机-XML

DECLARE @xml XML=
N'<Plans>
        <Plan>
          <Details>
               <IsSelected>true</IsSelected>
         </Details>  
        </Plan> 
        <Plan>
          <Details>
                 <IsSelected>false</IsSelected>
         </Details>  
        </Plan> 
        <Plan>
          <Details>
                <IsSelected>false</IsSelected>
         </Details>  
        </Plan>
  </Plans>';

--此查询将回答您的问题

如果我可以像上面的数据一样获得节点计数它应该返回计数 3 我可以设法解决这个问题

SELECT @xml.value('count(/Plans/Plan)','int') AS CountOfPlans;

--并且此查询会将第二个更改<IsSelected>为新值

DECLARE @position INT=2;
DECLARE @newValue VARCHAR(100)='blah';

SET @xml.modify('replace value of (/Plans/Plan[sql:variable("@position")]/Details/IsSelected/text())[1] with sql:variable("@newValue")');

SELECT @xml;

第一个返回“3”,第二个返回这个 XML

<Plans>
  <Plan>
    <Details>
      <IsSelected>true</IsSelected>
    </Details>
  </Plan>
  <Plan>
    <Details>
      <IsSelected>blah</IsSelected>
    </Details>
  </Plan>
  <Plan>
    <Details>
      <IsSelected>false</IsSelected>
    </Details>
  </Plan>
</Plans>

推荐阅读