2015-01-20 2 views
1

SQL 열에서 xml을 사용하지 않고 해당 열의 내용을 업데이트하는 데 질문이 있습니다. 가지고 /Name, PluginsProperties/ItemSQL XML 열 - 다른 노드를 기준으로 자식 노드 값을 업데이트하십시오.

의 목록과 이러한 다른 항목의 각이 Xml/Content/Queues/list/Item/

각 항목 :

나는 다음과 같은 XML 계층 구조를 포함하는 열 (ColumnXML)와 테이블 (TableXML)가 /key 예를 들어 value

:

<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/keyMSMQQueueType

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

없음 "대기열 항목"입니다

업데이트에게 /Xml/Content/Queues/list/Item/PluginProperties/Item/value 태그의 값을 PublicQueue

에 이름이 Data Load Exception 인 사용자 이외의 다른 사용자는 영향을 받아야하며 키가 MSMQQueueType 인 "PluginProperties 항목"이 영향을 받아야합니다 그것을 위해 ed.

감사합니다. =)

답변

1
그 다음이 많은 노드가 존재하는

 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' 

, 우리가 필요로 아래처럼 하나의 문에서 수행 할 수있는 단일 노드 인 경우이

을 할 replace value of 절을 사용할 수 있습니다

노드 수를 얻어 아래 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

+1

@ibiza, 나는 모든 XML 노드에 대해 대량 업데이트 옵션이 있다고 생각하지 않습니다. – radar

관련 문제