2015-01-20 218 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