2013-10-25 110 views
2

我想在元素標籤(如,所述元件在相同的電平)來代替值,取決於它的值,以及另一元素的值XML,兩個元件是內相同父元素標籤無處不在(每個父標籤由於其自己的ID屬性而是唯一的)。我想在存儲過程中在此XML變量的各個位置進行更改。修改(替換)爲條件

處於這第一個計時器,我堅持我怎麼能修改整個XML元素。兩個元素都存在於整個文檔的同一父元素中,並且這些父元素中的每一個都具有唯一的ID屬性。

任何建議將是很大的幫助。 文檔的鏈接瞭解如何混搭「值()」,「修改()」等也將有所幫助。

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 

我要替換格式值「NO」爲「F2」的,其格式值是「NO」和數據類型是「浮動」的所有屬性。

-Thankyou

+0

您可以加入您的XML輸入和期望的輸出XML的例子嗎? –

回答

4

它不可能一下子在SQL Server中的XML,還有一個是幾個選項來替代多個值:由一個

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

    • 使用循環和更新一個屬性
    • 使用XQuery重建XML

    我認爲科爾ECT方法可以讓你將循環解決方案:

    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

    所以它仍然無法正常工作?如果是這樣,你爲什麼接受答案? –