我有以下问题,希望有人能提供帮助。
我有一个包含几千行的 SQL Server 数据库。每行都包含一个带有 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 属性可以为真
- 如果 a 具有 @lang=en-US 属性,则 @invariant 必须为“真”。具有相同 occ、标签组合的其余字段必须保持“假”。(如示例代码中的标记 aa)
- 如果 a 具有 @lang=nl-NL 属性,但没有 @lang=en-US,则对于 'nl-NL',@invariant 必须为 'true'。具有相同 occ、标签组合的其余字段必须保持“假”。(如示例代码中的标记 ac)
- 如果一个 occ、标签组合只有 1 个实例,则 @invariant 必须为“真”。所以独立于@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”。
有人可以帮我建立正确的查询吗?提前致谢!