У меня есть следующая проблема и надеюсь, что кто-то может помочь.Редактировать XML с SQL-запросом SQL Server 2008 R2
У меня есть база данных SQL Server с несколькими тысячами строк. Каждая строка состоит из столбца с идентификатором и столбцом с данными XML.
Эти данные XML выглядит что-то вроде:
<record id="1">
<field tag="aa" occ="1" lang="nl-NL" invariant="false">Jan</field>
<field tag="aa" occ="1" lang="en-US" invariant="false">John</field>
<field tag="aa" occ="1" lang="de-DE" invariant="false">der Jan</field>
<field tag="aa" occ="2" lang="nl-NL" invariant="false">Jan2</field>
<field tag="aa" occ="2" lang="en-US" invariant="false">John2</field>
<field tag="ab" occ="1">Something</field>
<field tag="ac" occ="1" lang="de-DE" invariant="false">Rechnung</field>
<field tag="ac" occ="1" lang="nl-NL" invariant="false">rekening</field>
<field tag="ad" occ="1">Something2</field>
<field tag="ae" occ="1" lang="nl-NL" invariant="false">stoeptegel</field>
</record>
Я хотел бы изменить этот XML для каждой записи в соответствии со следующими правилами:
- Для каждого уникального OCC (вхождение), комбинация тегов только 1 атрибут @invariant может быть истинным
- Если a имеет атрибут @ lang = en-US, то @инвариант должен быть «истинным». Оставшиеся поля с той же окклюзией, комбинация тегов должны оставаться «ложными». (например, тег aa в образце кода)
- Если a имеет атрибут @ lang = nl-NL, но нет @ lang = en-US, то @invariant должен быть «истинным» для «nl-NL». Оставшиеся поля с той же окклюзией, комбинация тегов должны оставаться «ложными». (например, тег ac в образце кода)
- Если комбинация occ, tag имеет только 1 экземпляр, то @инвариант должен быть «истинным». Таким образом, независимо от значения @lang. (Например, тег ае в примере кода)
После запуска 1 или несколько запросов SQL, код должен выглядеть следующим образом:
<record id="1">
<field tag="aa" occ="1" lang="nl-NL" invariant="false">Jan</field>
<field tag="aa" occ="1" lang="en-US" invariant="true">John</field>
<field tag="aa" occ="1" lang="de-DE" invariant="false">der Jan</field>
<field tag="aa" occ="2" lang="nl-NL" invariant="false">Jan2</field>
<field tag="aa" occ="2" lang="en-US" invariant="true">John2</field>
<field tag="ab" occ="1">Something</field>
<field tag="ac" occ="1" lang="de-DE" invariant="false">Rechnung</field>
<field tag="ac" occ="1" lang="nl-NL" invariant="true">rekening</field>
<field tag="ad" occ="1">Something2</field>
<field tag="ae" occ="1" lang="nl-NL" invariant="true">stoeptegel</field>
</record>
Моя проблема заключается в создании правильного запроса SQL, чтобы заменить все узлы для всех записей, в соответствии с вышеуказанными правилами.
До сих пор я пришел с этим:
while exists
(
select *
from databasetable
where xmlcolumn.exist('/record/field/@invariant[.="false"]') = 1
)
update databasetable
set xmlcolumn.modify
('replace value of (/record/field/@invariant[.="false"])[1] with "true"')
Какими редактирует каждое значение @invariant в «истину».
Может ли кто-нибудь помочь мне составить правильный запрос? Заранее спасибо!
Было бы проще использовать LINQ в таком случае. –