私は次の問題を抱えており、誰かが助けてくれることを願っています。
数千行のSQLServerデータベースがあります。すべての行は、IDを持つ列と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属性のみがtrueになるタグの組み合わせ
- aに@lang= en-US属性がある場合、@invariantは「true」である必要があります。同じocc、タグの組み合わせを持つ残りのフィールドは「false」のままである必要があります。(サンプルコードのタグaaのように)
- aに@lang= nl-NL属性があり、@ lang = en-USがない場合、@invariantは「nl-NL」に対して「true」である必要があります。同じocc、タグの組み合わせを持つ残りのフィールドは「false」のままである必要があります。(サンプルコードのタグacのように)
- occ、タグの組み合わせにインスタンスが1つしかない場合、@invariantは「true」である必要があります。したがって、@lang値とは無関係です。(サンプルコードのタグaeのように)
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のすべての値を「true」に編集します。
誰かが正しいクエリを作成するのを手伝ってもらえますか?前もって感謝します!