Вставка атрибута на нескольких узлах в порядке увеличения - PullRequest
1 голос
/ 21 апреля 2020

У меня есть столбец XML в таблице SQL Server. Я хочу добавить атрибут к узлам, присутствующим в XML. Этот атрибут будет уникальным идентификатором для узлов.

Я написал некоторый код вроде:

DECLARE @i int, @key varchar(20);
SET @key = 'key'
SET @i = 1

IF (@i < 10)
    SET @key = @key + @i

UPDATE copy
SET dataxml.modify('insert attribute key {@key}
                    into (/Package[1]/Section/*[local-name() = ("List", "InputNumber", "InputText")][@i])[1]') 
WHERE id = 10; 

Я не уверен, как l oop над этим XML и как чтобы точно добавить атрибут в правильный узел, потому что он имеет такие узлы, как List, InputNumber, InputText в случайном порядке.

XML выглядит следующим образом:

<Package>
   <Section name='BOX'>
       <InputNumber description="[1] What is the height of the Box."> 
           <value/> 
       </InputNumber>
       <InputNumber description="[2] What is the width of the Box."> 
           <value/> 
       </InputNumber>
       <List description="[3] What is the type of BOX."> 
           <option/>
      </List>
   </Section>
   <Section name='Cover'>
       <InputText description="[4] Color of cover."> 
          <value/> 
       </InputText>
       <List description="[5] Type of cover."> 
          <option/>
      </List>
    </Section>
</Package>

Я хочу, чтобы вывод быть как:

<Package>
   <Section name='BOX'>
       <InputNumber key="key1" description="[1] What is the height of the Box."> 
           <value/> 
       </InputNumber>
       <InputNumber key="key2" description="[2] What is the width of the Box."> 
           <value/> 
       </InputNumber>
       <List key="key3" description="[3] What is the type of BOX."> 
           <option/>
      </List>
   </Section>
   <Section name='Cover'>
       <InputText key="key4" description="[4] Color of cover."> 
          <value/> 
       </InputText>
       <List key="key5" description="[5] Type of cover."> 
          <option/>
      </List>
    </Section>
</Package>

Я получаю ошибку при выполнении упомянутого запроса:

XQuery [copy.Data XML .modify ()]: узлы атрибутов верхнего уровня не поддерживаются

1 Ответ

0 голосов
/ 27 апреля 2020

Вы можете сделать это через некоторое время l oop, если есть что обновить.

declare @T table(dataxml xml not null);

insert into @T(dataxml) values
('<Package>
   <Section name=''BOX''>
       <InputNumber description="[1] What is the height of the Box."> 
           <value/> 
       </InputNumber>
       <InputNumber description="[2] What is the width of the Box."> 
           <value/> 
       </InputNumber>
       <List description="[3] What is the type of BOX."> 
           <option/>
      </List>
   </Section>
   <Section name=''Cover''>
       <InputText description="[4] Color of cover."> 
          <value/> 
       </InputText>
       <List description="[5] Type of cover."> 
          <option/>
      </List>
    </Section>
</Package>');

declare @key int = 1;

while 1 = 1
begin
  update @T
  set dataxml.modify('insert attribute key {sql:variable("@key")} into 
                      (/Package/Section/*[local-name() = ("List", "InputText", "InputNumber") and not(@key)])[1]')
  where dataxml.exist('/Package/Section/*[local-name() = ("List", "InputText", "InputNumber") and not(@key)]') = 1;

  if @@rowcount = 0
    break;

  set @key += 1;

end;

Результат:

<Package>
  <Section name="BOX">
    <InputNumber description="[1] What is the height of the Box." key="1">
      <value />
    </InputNumber>
    <InputNumber description="[2] What is the width of the Box." key="2">
      <value />
    </InputNumber>
    <List description="[3] What is the type of BOX." key="3">
      <option />
    </List>
  </Section>
  <Section name="Cover">
    <InputText description="[4] Color of cover." key="4">
      <value />
    </InputText>
    <List description="[5] Type of cover." key="5">
      <option />
    </List>
  </Section>
</Package>
...