2013-10-25 4 views
2

Я хочу заменить значение в теге элемента, в зависимости от его значения, а также значение другого элемента (на том же уровне, что и указанный элемент), причем оба элемента находятся внутри одного и того же тег родительского элемента везде (каждый родительский тег уникален из-за своего собственного атрибута ID). Я хочу сделать изменения в разных местах этой XML-переменной в хранимой процедуре.изменить (заменить) XML для условий

Будучи первым таймером при этом, я застрял в том, как я мог изменять элементы по всему XML. Оба элемента присутствуют в одном и том же родительском элементе по всему документу, и каждый из этих родительских тегов имеет уникальный атрибут идентификатора.

Любые предложения окажут большую помощь. Ссылки на документы о том, как смешивать и сопоставлять «значение()», «изменить()» и т. Д., Также помогут.

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» до «F2» для всех атрибутов, формат значение «n0» и DataType является «Поплавок».

-Thankyou

+0

Можете ли вы добавить пример ввода xml и желаемого вывода xml? –

ответ

4

это не представляется возможным заменить сразу нескольких значений в XML в SQL Server, есть ты несколько вариантов:

Я думаю корр ЭСТ способ для вас будет решение цикла:

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

, так ли это все еще не работает? если да, то почему вы приняли ответ? –

 Смежные вопросы

  • Нет связанных вопросов^_^