You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MS SQL Server中批量为指定@Name的XML标签添加属性

批量给XML中指定@Name的Field元素添加属性

我明白你现在的痛点——每次要给新的@Name值加属性都得手动改SQL再执行一遍,太麻烦了。问题出在SQL Server的XQuery实现不支持in运算符(这是XQuery 3.0的特性,SQL Server目前未实现),不过我们有两种靠谱的批量解决方案:

方案1:用or匹配多个@Name(适合短列表)

如果你的目标@Name列表不算太长,可以直接用or拼接多个匹配条件,替代in的逻辑:

update ListDataFormatter_Test 
SET FieldDefinition.modify('
    insert attribute PlainTextPersonNotification {"True"} 
    into (/Fields/Field[@Name="PatientNames" 
                        or @Name="ProviderNames" 
                        or @Name="PracticeSettingsName" 
                        or @Name="PracticeSettingsMainAddresses" 
                        or @Name="PracticeSettingsPhones"])[1]
')

这条语句会一次性给所有匹配到的Field元素添加目标属性,不用逐条执行。

方案2:用表变量批量处理(适合长/动态列表)

如果你的@Name列表一直在扩充,用表变量存储目标值会更灵活,扩展性更强:

-- 第一步:定义要处理的@Name列表,后续新增直接在这里加值
DECLARE @TargetNames TABLE (Name NVARCHAR(100))
INSERT INTO @TargetNames (Name)
VALUES ('PatientNames'), 
       ('ProviderNames'), 
       ('PracticeSettingsName'), 
       ('PracticeSettingsMainAddresses'), 
       ('PracticeSettingsPhones')

-- 第二步:批量更新匹配的XML元素
UPDATE l
SET FieldDefinition.modify('
    insert attribute PlainTextPersonNotification {"True"} 
    into (/Fields/Field[@Name=sql:column(''t.Name'')])[1]
')
FROM ListDataFormatter_Test l
CROSS APPLY @TargetNames t
WHERE l.FieldDefinition.exist('/Fields/Field[@Name=sql:column(''t.Name'')]') = 1

这里的sql:column(''t.Name'')用来引用外部表变量里的Name值,exist()函数确保只更新确实包含对应Field元素的行,避免无效操作。后续要新增@Name值,只需要往@TargetNames里插新数据就行,不用改更新逻辑。

效果验证

以你提供的XML示例为例,执行后PatientNames和PracticeSettingsName元素会变成:

<Field Name="PatientNames" Layout="Name" PlainTextPersonNotification="True" />
<Field Name="PracticeSettingsName" Layout="Date" PlainTextPersonNotification="True" />

内容的提问来源于stack exchange,提问作者Display name

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:43:22