Требуется регистр символов в атрибуте для поиска дубликатов - PullRequest
1 голос
/ 01 мая 2019

У меня есть XML, такой как:

<History>
   <Event></Event>
   <Event></Event>
</History>

И мне нужно добавить атрибут порядка сортировки для каждого события, чтобы получить это:

<History>
   <Event SortOrder="1"></Event>
   <Event SortOrder="2"></Event>
</History>

Каким-то образом я закончил снесколько строк, имеющих порядок сортировки дважды, один верхний регистр и один нижний регистр.(и значения разные).

Я не уверен, как это случилось.У меня есть хранимая процедура для добавления порядка сортировки к существующим записям, и у нас есть код dotNet, который кто-то другой написал для добавления порядка сортировки к новым записям.

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

select m.c.query('.') theElement
       from Histories h
              cross apply h.XMLHistory.nodes('History/Entry') m(c)
       where (
            XmlHistory.exist('(History/Entry[(@SortOrder)])')= 1       
            and XmlHistory.exist('(History/Entry[(@sortOrder)])')= 1 
        )

Мой процесс добавления порядка сортировки делает это:

update Histories
   set 
   XmlHistory.modify('
      insert attribute SortOrder {sql:variable("@sortOrder")}
         into (History/Entry[not(@SortOrder)])[1]
      ')
where HistoryID=@historyID

Это добавляет SortOrder, когда это не тактам.Может быть, строчная версия уже там, а потом я добавляю заглавную версию?Я так не думаю, потому что мой выбор выше не чувствителен к регистру?

  1. Как мне найти дупла?Я думаю, что мне нужен регистр, чувствительный к регистру.
  2. Похоже, что мое обновление вызывает провалы?

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

XPath чувствителен к регистру, как XML.Если вы хотите выбрать каждый Entry, имеющий атрибут с именем SortOrder в любой комбинации букв, используйте:

History/Entry[@*[translate(name(),'SORTDE','sortde') = 'sortorder']]
0 голосов
/ 08 мая 2019

exist() чувствителен к регистру.

Это вернет элементы, которые имеют атрибут SortOrder и атрибут sortOrder.

select m.c.query('.') as theElement
from Histories as h
  cross apply h.XMLHistory.nodes('/History/Event') as m(c)
where m.c.exist('@SortOrder') = 1 and
      m.c.exist('@sortOrder') = 1;
...