2015-01-20 159 views
1

我不习惯在sql列中使用xml,并且有关于更新该列内容的问题。SQL XML列 - 基于其他节点更新子节点值

我有一个表(TableXML)用含有如下XML层次结构的柱(ColumnXML):Xml/Content/Queues/list/Item/

每个条目有一个/Name,的PluginsProperties/Item

列表以及每个这些其它项的有/keyvalue

例如:

<Xml> 
    <Content Tr="1"> 
     <Queues Tr="12"> 
      <list Tr="13"> 
       <Item Tr="14"> 
        <Name Tr="2">Data Load Exception</Name> 
        <PluginProperties Tr="15"> 
         <Item Tr="16"> 
          <key Tr="2">MSMQQueueType</key> 
          <value Tr="2">PrivateQueue</value> 
         </Item> 
         ...........more items 
        </PluginProperties> 
       </Item> 
       ...........more items 
      </list> 
     </Queues> 
    </Content> 
</Xml> 

我想这样做:

更新/Xml/Content/Queues/list/Item/PluginProperties/Item/value标签的价值PublicQueue

其中/Xml/Content/Queues/list/Item/PluginProperties/Item/keyMSMQQueueType

/Xml/Content/Queues/list/Item/NameData Load Exception

无 “队列项”除名称为Data Load Exception的应该会受到影响,并且除了使用MSMQQueueType键之外的其他“PluginProperties项目”应该被影响编辑它。

谢谢! =)

回答

1

可以使用replace value of子句来做到这一点

,如果它是一个节点那么它可以与单个语句来完成类似下面

 update TableXML 
    set columnXML.modify(' 
      replace value of ((/Xml/Content/Queues/list/Item/PluginProperties/Item/value)[1]/text())[1] with ''PublicQueue''') 
where columnXML.value('((/Xml/Content/Queues/list/Item/PluginProperties/Item/key)[1]/text())[1]','varchar(50)') = 'MSMQQueueType' 
    and columnXML.value('((/Xml/Content/Queues/list/Item/Name)[1]/text())[1]','varchar(50)') = 'Data Load Exception' 

AS存在很多节点,我们需要以获得节点的计数,并使用while循环如下所示

declare @elements int 

select @elements = ISNULL(columnXML.value('count(/Xml/Content/Queues/list/Item/PluginProperties/Item)', 'int'),0) 
from TableXML 


while @elements > 0 
begin 

    update TableXML 
    set columnXML.modify 
    ('replace value of ((/Xml/Content/Queues/list/Item/PluginProperties/Item/value)[sql:variable("@elements")]/text())[1] 
     with ''PublicQueue''') 
    where columnXML.value('((/Xml/Content/Queues/list/Item/PluginProperties/Item/key)[sql:variable("@elements")]/text())[1]','varchar(50)') = 'MSMQQueueType' 
    and columnXML.value('((/Xml/Content/Queues/list/Item/Name)[sql:variable("@elements")]/text())[1]','varchar(50)') = 'Data Load Exception' 


    set @elements = @elements - 1 
end 
+0

嗨,谢谢! SQL XML无法用单个语句更新许多节点吗? (所有节点匹配过滤器) – ibiza 2015-01-20 21:11:46

+1

@ibiza,我不认为所有XML节点都有一个批量更新选项 – radar 2015-01-20 21:14:14