Правильный XQuery для вставки атрибутов XML в переменную XML в SQL Server на основе оператора if - PullRequest
0 голосов
/ 16 июня 2011

У меня есть следующий xml:

               <tr>
            <td>Lycamobile</td>
            <td>EV</td>
            <td>5.00</td>
            <td>0</td>
            <td>0</td>
            <td>13951</td>
            <td>42</td>
            <td>332</td>
            <td>13951</td>
            <td>0</td>
            <td>0</td>
            <td>332</td>
        </tr>
        <tr>
            <td>Lycamobile</td>
            <td>EV</td>
            <td>10.00</td>
            <td>0</td>
            <td>0</td>
            <td>6494</td>
            <td>0</td>
            <td>0</td>
            <td>6494</td>
            <td>0</td>
            <td>0</td>
            <td>0</td>
        </tr>
        <tr>
            <td>Lycamobile</td>
            <td>EV</td>
            <td>15.00</td>
            <td>0</td>
            <td>0</td>
            <td>7709</td>
            <td>0</td>
            <td>0</td>
            <td>7709</td>
            <td>0</td>
            <td>0</td>
            <td>0</td>
        </tr>
        <tr>
            <td>Lycamobile</td>
            <td>EV</td>
            <td>20.00</td>
            <td>0</td>
            <td>300</td>
            <td>8823</td>
            <td>0</td>
            <td>0</td>
            <td>8823</td>
            <td>0</td>
            <td>0</td>
            <td>0</td>
        </tr>
        <tr>
            <td>Orange</td>
            <td>ATC</td>
            <td>5.00</td>
            <td>0</td>
            <td>0</td>
            <td>10641</td>
            <td>182</td>
            <td>58</td>
            <td>10641</td>
            <td>0</td>
            <td>0</td>
            <td>58</td>
        </tr>
        <tr>
            <td>Orange</td>
            <td>ATC</td>
            <td>10.00</td>
            <td>0</td>
            <td>0</td>
            <td>6312</td>
            <td>12</td>
            <td>526</td>
            <td>6312</td>
            <td>0</td>
            <td>0</td>
            <td>526</td>
        </tr>
        <tr>
            <td>Orange</td>
            <td>ATC</td>
            <td>15.00</td>
            <td>0</td>
            <td>0</td>
            <td>7674</td>
            <td>0</td>
            <td>0</td>
            <td>7674</td>
            <td>0</td>
            <td>0</td>
            <td>0</td>
        </tr>
        <tr>
            <td>Orange</td>
            <td>ATC</td>
            <td>20.00</td>
            <td>0</td>
            <td>0</td>
            <td>8873</td>
            <td>0</td>
            <td>0</td>
            <td>8873</td>
            <td>0</td>
            <td>0</td>
            <td>0</td>
        </tr>
        <tr>
            <td>Vodafone</td>
            <td>EV</td>
            <td>5.00</td>
            <td>0</td>
            <td>0</td>
            <td>9911</td>
            <td>0</td>
            <td>0</td>
            <td>9911</td>
            <td>0</td>
            <td>0</td>
            <td>0</td>
        </tr>

Я хочу добавить Атрибут для каждого tr, где 12-й подэлемент td равен 58.

Это будет 5-й tr в этом примере

Весь артефакт XML сохраняется в переменной @ changesxml

Я так далеко:

SET @changesxml.modify('insert
    if (//tr/td[12]/text()="58")
    then attribute style {"background-color: #FF8B6F;"}
    else ()
        as first into   (/root/tr)[1] ')

Но это все время добавляет к первому тр.

Благодарен за любую помощь.

1 Ответ

1 голос
/ 17 июня 2011

Он все время добавляет это к первому значению tr из-за

(/root/tr)[1]

Вы говорите, чтобы добавить его к первому элементу tr, найденному под корневым элементом.

Что-токак это будет сделано для первого найденного tr, который имеет 12-й тд со значением 58:

SET @xml.modify('insert     
attribute style {"background-color: #FF8B6F;"} 
into   (//tr[(td[12])/text()="58"])[1] ') 

Это будет работать только для первого найденного, но это должно помочь вам начать.Вам нужно создать цикл, чтобы получить все из них.Если вы создаете цикл и хотите, чтобы конечный индексатор был динамическим, вам нужно будет обернуть все в sp_executesql и запустить его как одну команду.Если вы попытаетесь сделать что-то вроде:

SET @xml.modify('insert     
    attribute style {"background-color: #FF8B6F;"} 
    into   (//tr[(td[12])/text()="58"])[' + @val + '] ')

, произойдет сбой, потому что .modify требует строкового литерала.Поэтому вам нужно сделать что-то вроде

declare @command nvarchar(1000)
declare @int int = 1

SET @command = '
SET @xml.modify(''insert     
attribute style {"background-color: #FF8B6F;"} 
into   (//tr[(td[12])/text()="58"])[' + CAST(@int AS nvarchar(6)) + '] '') '

EXEC sp_executesql @stmt = @command,
                   @params = N'@xml xml out',
                   @xml = @xml OUTPUT

SELECT @xml

Где переменная @int является вашей переменной-счетчиком.

...