2013-10-25 5 views
2

그 값에 따라 요소 태그의 값을 바꾸고 싶습니다. 그리고 그 요소와 동일한 레벨에있는 다른 요소의 값을 바꾸고 싶습니다. 모든 요소 태그는 모든 ID 태그 속성으로 인해 고유합니다. 저장 프로 시저에서이 XML 변수의 여러 위치에서 변경 작업을 수행하려고합니다.조건을 위해 XML을 수정 (바꾸기)

첫 번째 타이머이기 때문에 XML 전체에서 요소를 수정할 수있는 방법을 고수했습니다. 두 요소는 모두 문서 전체에서 동일한 부모 요소에 존재하며 모든 부모 태그는 고유 한 ID 특성을 갖습니다.

어떤 제안이라도 도움이 될 것입니다. "value()", "modify()"등을 혼합하고 일치시키는 방법에 대한 문서 링크가 도움이 될 것입니다.

DECLARE @xml xml = ' 
<SemanticModel xmlns="schemas.microsoft.com/sqlserver/2004/10/semanticmodeling"; xmlns:xsi="w3.org/2001/XMLSchema-instance"; xmlns:xsd="w3.org/2001/XMLSchema"; ID="G1"> 
    <Entities> 
     <Entity ID="E1"> 
      <Fields> 
       <Attribute ID="A1"> 
        <Name>AAAA</Name> 
        <DataType>Float</DataType> 
        <Format>n0</Format> 
        <Column Name="AAAA_ID" /> 
       </Attribute> 
       <Attribute ID="A2"> 
        <Name>BBBB</Name> 
        <DataType>Integer</DataType> 
        <Format>n0</Format> 
        <Column Name="BBBB_ID" /> 
       </Attribute> 
       <Attribute ID="A3"> 
        <Name>KKKK</Name> 
        <Variations> 
         <Attribute ID="A4"> 
          <Name>CCCC</Name> 
          <DataType>Float</DataType> 
          <Format>n0</Format> 
         </Attribute> 
         <Attribute ID="A5"> 
          <Name>AAAA</Name> 
          <DataType>Float</DataType> 
          <Format>n0</Format> 
         </Attribute> 
        </Variations> 
        <Name>AAAA</Name> 
        <DataType>Float</DataType> 
        <Format>n0</Format> 
       </Attribute> 
      </Fields> 
     </Entity> 
    </Entities>' 
DECLARE @i int = 0 
;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/10/semanticmodeling' as dm, 'http://schemas.microsoft.com/analysisservices/2003/engine' as dsv, 'http://w3.org/2001/XMLSchema' as xs) 
select @i = @xml.value('count(//dm:Attribute[dm:DataType="Float" and dm:Format="n0"]/dm:Format)', 'int') 
select @i 
while @i > 0 
begin 
    set @xml.modify(' 
     replace value of 
      (//dm:Attribute[dm:DataType="Float" and dm:Format="n0"]/dm:Format/text())[1] 
     with "f2" 
    ') 

    set @i = @i - 1 
end 
select @xml 

나는 그 형식 값 "N0"이며 데이터 형식은 "부동"모든 속성에 대한 형식 값 "N0"을 "F2"를 대체합니다.

-Thankyou

+0

입력 XML 및 원하는 출력 XML의 예를 추가 할 수 있습니까? –

답변

4

는 SQL Server의 XML로하는 몇 가지 옵션이있어 한 번에 여러 값을 대체하는 것은 불가능 하나

  • split data into temporary table/table variable, update and then merge into one xml에 의해

    • 사용 루프와 업데이트가 하나의 속성을
    • 사용 XQuery는 내가 CORR 생각 XML을

    를 다시 요법의 방법 당신은 루프 해결책이 될 것이기 :

    select @i = @data.value('count(//Attribute[DataType="Float" and Format="n0"]/Format)', 'int') 
    
    while @i > 0 
    begin 
        set @data.modify(' 
         replace value of 
          (//Attribute[DataType="Float" and Format="n0"]/Format/text())[1] 
         with "f2" 
        ') 
    
        set @i = @i - 1 
    end 
    

    sql fiddle demo


    당신의 XML은 namepaces, 내가 default 네임 스페이스 선언하는 것입니다 발견 업데이트하는 간단한 방법이 포함 된 경우 :

    ;with xmlnamespaces(default 'schemas.microsoft.com/sqlserver/2004/10/semanticmodeling') 
    select @i = @xml.value('count(//Attribute[DataType="Float" and Format="n0"]/Format)', 'int') 
    
    while @i > 0 
    begin 
        set @xml.modify(' 
         declare default element namespace "schemas.microsoft.com/sqlserver/2004/10/semanticmodeling"; 
         replace value of 
          (//Attribute[DataType="Float" and Format="n0"]/Format/text())[1] 
         with "f2" 
        ') 
    
        set @i = @i - 1 
    end 
    select @xml 
    
  • +0

    XML은 형식화 된 XML입니다. 따라서 첫 번째 싱글 톤만 업데이트됩니다. – aaryan

    +0

    @aaryan XML 스키마의 예가 있습니까? 나는 그것이 어쨌든 작동해야한다고 생각한다. –

    +0

    그래서 여전히 작동하지 않는다? 그렇다면 왜 대답을 받아 들였습니까? –