XML-файл SQL Server обновляет значение одного узла, где текст другого узла равен XXX - PullRequest
0 голосов
/ 04 июня 2018

Вот XML, который у меня есть в моем поле таблицы

<CtcConfiguration xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Ctc>3</Ctc>
    <SalaryComponent>
        <SalaryComponentConfiguration>
            <Name>Basic</Name>
            <DisplayOrder>0</DisplayOrder>
            <Value>5634655</Value>
        </SalaryComponentConfiguration>
        <SalaryComponentConfiguration>
            <Name>HR</Name>
            <DisplayOrder>0</DisplayOrder>
            <Value>1234</Value>
        </SalaryComponentConfiguration>
        <SalaryComponentConfiguration>
            <Name>medical</Name>
            <DisplayOrder>0</DisplayOrder>
            <Value>0</Value>
        </SalaryComponentConfiguration>
    </SalaryComponent>
</CtcConfiguration>

Я хочу обновить значение node(DisplayOrder) в зависимости от node(Name).Например, если я даю имя как medical , оно должно обновить значение displayorder по мере необходимости.

Это то, что я пробовал до сих пор:

UPDATE payroll.pays set 
    CtcConfiguration.modify('replace value of (/CtcConfiguration/SalaryComponent/SalaryComponentConfiguration/DisplayOrder/text())[1] with ("99999")') 
where 
    CtcConfiguration.value('((/CtcConfiguration/SalaryComponent/SalaryComponentConfiguration/Name)[]/text())[1]','varchar(50)') = 'HR'

1 Ответ

0 голосов
/ 04 июня 2018

Попробуйте это так:

подсказка: Этот пример манипулирует <Value>, но он работает так же и для <DisplayOrder>.

DECLARE @mockupTable TABLE(ID INT IDENTITY, YourXML XML);
INSERT INTO @mockupTable VALUES
(N'<CtcConfiguration xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Ctc>3</Ctc>
    <SalaryComponent>
        <SalaryComponentConfiguration>
            <Name>Basic</Name>
            <DisplayOrder>0</DisplayOrder>
            <Value>5634655</Value>
        </SalaryComponentConfiguration>
        <SalaryComponentConfiguration>
            <Name>HR</Name>
            <DisplayOrder>0</DisplayOrder>
            <Value>1234</Value>
        </SalaryComponentConfiguration>
        <SalaryComponentConfiguration>
            <Name>medical</Name>
            <DisplayOrder>0</DisplayOrder>
            <Value>0</Value>
        </SalaryComponentConfiguration>
    </SalaryComponent>
</CtcConfiguration>');


DECLARE @AttributeName VARCHAR(100)=N'medical';
DECLARE @NewValue INT=12345;

UPDATE @mockupTable
SET YourXML.modify(N'replace value of (/CtcConfiguration
                                       /SalaryComponent
                                       /SalaryComponentConfiguration[(Name/text())[1]=sql:variable("@AttributeName")]
                                       /Value/text())[1] 
                     with sql:variable("@NewValue")');


SELECT * FROM @mockupTable;

Краткое объяснение

Ваш XML представляет собой довольно простую модель атрибута-значения (с видимым рангом).Вы используете предикат XQuery , чтобы отфильтровать правильный атрибут и установить этот специальный <Value>.Таким образом, вы должны искать <SalaryComponentConfiguration>, где <Name> имеет специальный контент.

...