用于在SQL Server中基于if语句在XML变量中插入XML属性的正确XQuery

时间:2011-06-16 16:10:34

标签: sql-server xml xquery

我有以下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>

我想为第12个td子元素为58的每个tr添加一个属性。

这将是本例中的第5个

整个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] ')

但这会将它一直添加到第一个tr。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

由于

,它会一直添加到第一个tr
(/root/tr)[1]

您告诉它将它添加到根元素下找到的第一个tr元素。

像这样的东西会为第一个发现第12个td值为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是你的计数器变量。