【问题标题】:Update XML data for multiple nodes更新多个节点的 XML 数据
【发布时间】:2019-03-30 14:19:48
【问题描述】:

我想根据所选计划更新 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-server xml sql-server-2008


    【解决方案1】:

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

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

    一个样机-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;
    

    --而且这个查询会把第二个&lt;IsSelected&gt;改成一个新值

    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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-27
      • 2013-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 1970-01-01
      • 2020-09-24
      相关资源
      最近更新 更多