如何在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
相关产品推荐
相关产品推荐

