sql – 修改(替换)条件的XML
发布时间:2020-12-12 16:24:43 所属栏目:MsSql教程 来源:网络整理
导读:我想替换元素标记中的值,取决于它的值,以及另一个元素的值(与所述元素处于同一级别),两个元素都在同一个父元素标记内(每个父标记都是唯一的)由于它自己的ID属性).我想在存储过程中在此XML变量的各个位置进行更改. 作为第一个计时器,我坚持我如何修改整个xml中
我想替换元素标记中的值,取决于它的值,以及另一个元素的值(与所述元素处于同一级别),两个元素都在同一个父元素标记内(每个父标记都是唯一的)由于它自己的ID属性).我想在存储过程中在此XML变量的各个位置进行更改.
作为第一个计时器,我坚持我如何修改整个xml中的元素.两个元素都存在于整个文档的同一父元素中,并且这些父标记中的每一个都具有唯一的ID属性. 任何建议都会有很大帮助. DECLARE @xml xml = ' <SemanticModel xmlns="schemas.microsoft.com/sqlserver/2004/10/semanticmodeling"; xmlns:xsi="w3.org/2001/XMLSchema-instance"; xmlns:xsd="w3.org/2001/XMLSchema"; ID="G1"> <Entities> <Entity ID="E1"> <Fields> <Attribute ID="A1"> <Name>AAAA</Name> <DataType>Float</DataType> <Format>n0</Format> <Column Name="AAAA_ID" /> </Attribute> <Attribute ID="A2"> <Name>BBBB</Name> <DataType>Integer</DataType> <Format>n0</Format> <Column Name="BBBB_ID" /> </Attribute> <Attribute ID="A3"> <Name>KKKK</Name> <Variations> <Attribute ID="A4"> <Name>CCCC</Name> <DataType>Float</DataType> <Format>n0</Format> </Attribute> <Attribute ID="A5"> <Name>AAAA</Name> <DataType>Float</DataType> <Format>n0</Format> </Attribute> </Variations> <Name>AAAA</Name> <DataType>Float</DataType> <Format>n0</Format> </Attribute> </Fields> </Entity> </Entities>' DECLARE @i int = 0 ;WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/10/semanticmodeling' as dm,'http://schemas.microsoft.com/analysisservices/2003/engine' as dsv,'http://w3.org/2001/XMLSchema' as xs ) select @i = @xml.value('count(//dm:Attribute[dm:DataType="Float" and dm:Format="n0"]/dm:Format)','int') select @i while @i > 0 begin set @xml.modify(' replace value of (//dm:Attribute[dm:DataType="Float" and dm:Format="n0"]/dm:Format/text())[1] with "f2" ') set @i = @i - 1 end select @xml 我希望将格式值为“n0”的格式值“n0”替换为“f2”,并且DataType为“Float”. -谢谢 解决方法在SQL Server中的xml中不可能一次替换多个值,有几个选项:>逐个使用循环和更新属性 我认为正确的方法是循环解决方案: select @i = @data.value('count(//Attribute[DataType="Float" and Format="n0"]/Format)','int') while @i > 0 begin set @data.modify(' replace value of (//Attribute[DataType="Float" and Format="n0"]/Format/text())[1] with "f2" ') set @i = @i - 1 end sql fiddle demo 如果您的xml包含名称空间,我发现的最简单的更新方法是声明默认名称空间: ;with xmlnamespaces(default 'schemas.microsoft.com/sqlserver/2004/10/semanticmodeling') select @i = @xml.value('count(//Attribute[DataType="Float" and Format="n0"]/Format)','int') while @i > 0 begin set @xml.modify(' declare default element namespace "schemas.microsoft.com/sqlserver/2004/10/semanticmodeling"; replace value of (//Attribute[DataType="Float" and Format="n0"]/Format/text())[1] with "f2" ') set @i = @i - 1 end select @xml (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |