Удаление дублирующихся атрибутов XML - SQL Server - PullRequest
0 голосов
/ 11 июля 2019

У меня есть ситуация, когда у меня есть дубликаты атрибутов XML в столбце SQL Server.

Скрипт БД для sql: http://sqlfiddle.com/#!18/bfd7d8

Таблица:

create table test12
(
  id int,
  data xml
  );

  insert into test12 (id,data)
  values (1,
    '<test1>
<Attribute>FGHH</Attribute>
    <Value>Long</Value>
</test1>

    <test1>
<Attribute>FGHH</Attribute>
<Value>Long</Value>
    </test1>'

  )

XML-код, о котором идет речь,

    '<test1>
<Attribute>FGHH</Attribute>
    <Value>Long</Value>
</test1>

    <test1>
<Attribute>FGHH</Attribute>
<Value>Long</Value>
    </test1>'

Может кто-нибудь дать совет, как бы я удалил одну из этих повторяющихся строк из XML. Я хочу сохранить только один из дубликатов XML. Поэтому вывод, который я ищу:

<test1>
<Attribute>FGHH</Attribute>
<Value>Long</Value>
    </test1>'

Я знаю, что мог бы просто использовать DISTINCT, чтобы выбрать это, но как мне на самом деле удалить это дублирование из XML? Любая помощь будет отличной. Спасибо

1 Ответ

0 голосов
/ 11 июля 2019

Если честно: может быть проще прочитать это в виде таблицы и воссоздать XML с нуля.

Но XQuery вам тоже может помочь:

create table test12
(
  id int,
  data xml
  );

- Я добавил несколько узлов и изменил <Value>, чтобы отразить данный узел

  insert into test12 (id,data)
  values (1,
    '<test1>
<Attribute>FGHH</Attribute>
    <Value>blah 1</Value>
</test1>

    <test1>
<Attribute>OneMore</Attribute>
<Value>blah 1</Value>
    </test1>

    <test1>
<Attribute>FGHH</Attribute>
<Value>blah 2</Value>
    </test1>

    <test1>
<Attribute>SomeOther</Attribute>
<Value>blah 1</Value>
    </test1>'

  );
GO

- Это запрос

SELECT t.id
      ,t.data.query('for $attrValue in distinct-values(/test1/Attribute/text())
                     return /test1[Attribute = $attrValue][1]')
FROM test12 t;

Идея вкратце:

Функция XQuery distinct-values() вернет отдельный список всех значений по заданному пути.В этом случае мы получаем список text() -узлов назад.
Теперь мы можем перебрать этот список и вернуть первое вхождение каждого элемента <test1>, где <Attribute> равно переменной списка.В результате мы получаем первые из каждого вида обратно:

<test1>
  <Attribute>FGHH</Attribute>
  <Value>blah 1</Value>
</test1>
<test1>
  <Attribute>OneMore</Attribute>
  <Value>blah 1</Value>
</test1>
<test1>
  <Attribute>SomeOther</Attribute>
  <Value>blah 1</Value>
</test1>
...