2015-06-09 5 views
1

Использование SQL Server 2012, если у меня есть следующее значение в одной строке столбца типа XML:T-SQL значение элемента обновления XML на основе другого значения элемента

<ArrayOfScheduledJobParameters xmlns="http://schemas.data.org/ScheduledJobServiceLibrary"> 
    <ScheduledJobParameters> 
    <Key>OutputFileName</Key> 
    <Value>CPVR{0}.txt</Value> 
    </ScheduledJobParameters> 
    <ScheduledJobParameters> 
    <Key>DaysBeforeExpiration</Key> 
    <Value>60</Value> 
    </ScheduledJobParameters> 
    <ScheduledJobParameters> 
    <Key>MaxItemsByReportServiceCall</Key> 
    <Value>100</Value> 
    </ScheduledJobParameters> 
</ArrayOfScheduledJobParameters> 

Я хочу, чтобы изменить значение из элемент <Value> на основе значения, содержащегося в элементе <Key>. В частности, я хочу иметь возможность устанавливать <Value> на 150, где элемент <Key> содержит значение «MaxItemsByReportServiceCall». Все, что я смог сделать, это обновить первый узел <ScheduledJobParameters>. Я не могу найти, как это сделать, если это возможно даже в любой документации, которую я читал на XML DML.

ответ

2

Вы можете использовать функцию modify() и исправить XQuery, чтобы установить необходимое значение. Синтаксис довольно сложно, хотя:

UPDATE YourTableName 
SET ColumnName.modify('declare namespace NS="http://schemas.data.org/ScheduledJobServiceLibrary";replace value of (/NS:ArrayOfScheduledJobParameters/NS:ScheduledJobParameters[NS:Key="MaxItemsByReportServiceCall"]/NS:Value/text())[1] with "150"') 
WHERE <your conditions to select rows> 

modify() В функции вы сначала объявить пространство имен. Затем вы используете replace value of и исправьте XQUery. Для XQuery вы найдете элемент ScheduledJobParameters, у которого есть дочернее имя элемента со значением MaxItemsByReportServiceCall и выберите текст его дочернего элемента. Затем вы используете with "new value" для обновления поля.

+0

@dotnettom Я только что присоединился, поэтому я еще не могу проголосовать (нужно 15 репутации), но я просто хочу поблагодарить вас и согласился с тем, что синтаксис не является интуитивным вообще. – Beneque

+0

@Beneque, по крайней мере, вы можете принять этот ответ: http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – har07