次の問題があり、誰かが助けてくれることを願っています。SQLクエリでXMLを編集するSQL Server 2008 R2
私は数千の行を持つSQL Serverデータベースを持っています。すべての行は、IDを持つ列とXMLデータを持つ列で構成されます。すべてのユニークOCCについては
- (出現)、タグの組み合わせ:私は、次のルールに従ってすべてのレコードに対して、この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データは、何かのように見えます1 @variant属性のみが真である可能性があります
- aが@ lang = en-US属性を持つ場合、@invariantは 'true'でなければなりません。同じocc、tagの組み合わせを持つ残りのフィールドは、「false」のままでなければなりません。 (サンプルコードではタグaaのように)
- aが@ lang = nl-NL属性を持ち、@ lang = en-USを持たない場合、@invariantは 'nl-NL'の 'true'でなければなりません。同じocc、tagの組み合わせを持つ残りのフィールドは、「false」のままでなければなりません。 (サンプルコードのタグacのような)
- タグの組み合わせのインスタンスが1つしかない場合、@invariantは 'true'にする必要があります。したがって、@lang値とは無関係です。 (サンプルコードでのAEタグなど)
1つの以上のSQLクエリを実行した後、コードは次のようになります。私の問題はすべてのために、すべてのノードを置き換えるために、正しい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>
上記の規則に従って、記録する。
は、これまでのところ、私はこの思い付いた:「真」に@invariantのすべての値を編集
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"')
を。
誰かが正しいクエリを作成するのに役立つでしょうか?前もって感謝します!
このような場合は、LINQを使用する方がはるかに簡単です。 –