Обновить данные XML для нескольких узлов - PullRequest
0 голосов
/ 30 марта 2019

Я хочу обновить выбранные данные плана на основе выбранного плана

            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, который мне удастся исправить.

1 Ответ

0 голосов
/ 29 мая 2019

Этот ответ, вероятно, поздно ... Но он все еще может быть полезным ...

Должен признать, что я не совсем понял вашу проблему. Попробуйте это:

A mockup-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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...