sql xquery для добавления блока xml в определенную позицию

Используя sql server 2012 sp1, мне не удалось найти решение, но я считаю, что невозможно добавить блок xml в определенную позицию существующего столбца xml в таблице. Например, скажем, у нас было tbTable.AnimalsXML, что равно:

<Animals>
  <Animal name="Dog">
    <Enclosure id="Default">
      <Value>xyz</Value>
    </Enclosure>
  </Animal>
  <Animal name="Cat">
    <Enclosure id="Default">
      <Value>xyz</Value>
    </Enclosure>
  </Animal>
  <Animal name="Bird">
    <Enclosure id="Default">
      <Value>xyz</Value>
    </Enclosure>
  </Animal>
  <Animal name="Sheep">
    <Enclosure id="Default">
      <Value>xyz</Value>
    </Enclosure>
  </Animal>
</Animals>

Как вставить:

<Animal name="Goat">
    <Enclosure id="Default">
      <Value>xyz</Value>
    </Enclosure>
</Animal>

между блоками Cat и Bird?

Пробовал position() и нашел это проблема, как нам это сделать в sql, используя:

update tbTable set AnimalsXML.modify('
            insert
                sql:variable("@var")
            as "specific position"
            into (/Animals)[1]')

person Skeezwiz    schedule 14.03.2016    source источник


Ответы (1)


Вы можете использовать конструкцию insert ... after ... для вставки нового элемента после определенного существующего элемента. Пример ниже вставляет новый элемент после существующего элемента <Animal name="Cat">:

declare @data XML = '<Animals>
  <Animal name="Dog">
    <Enclosure id="Default">
      <Value>xyz</Value>
    </Enclosure>
  </Animal>
  <Animal name="Cat">
    <Enclosure id="Default">
      <Value>xyz</Value>
    </Enclosure>
  </Animal>
  <Animal name="Bird">
    <Enclosure id="Default">
      <Value>xyz</Value>
    </Enclosure>
  </Animal>
  <Animal name="Sheep">
    <Enclosure id="Default">
      <Value>xyz</Value>
    </Enclosure>
  </Animal>
</Animals>'

set @data.modify('
insert 
    <Animal name="Goat">
        <Enclosure id="Default">
          <Value>xyz</Value>
        </Enclosure>
    </Animal>
after (/Animals/Animal[@name="Cat"])[1]
')
person har07    schedule 14.03.2016
comment
оууу, спасибо, я использовал first & last и ничего не добился, но не знал о том, что было до и после, как [ссылка] msdn.microsoft.com/en-AU/library/ms175466.aspx - person Skeezwiz; 15.03.2016