sql – 修改(替换)条件的XML

前端之家收集整理的这篇文章主要介绍了sql – 修改(替换)条件的XML前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想替换元素标记中的值,取决于它的值,以及另一个元素的值(与所述元素处于同一级别),两个元素都在同一个父元素标记内(每个父标记都是唯一的)由于它自己的ID属性).我想在存储过程中在此XML变量的各个位置进行更改.

作为第一个计时器,我坚持我如何修改整个xml中的元素.两个元素都存在于整个文档的同一父元素中,并且这些父标记中的每一个都具有唯一的ID属性.

任何建议都会有很大帮助.
关于如何混合和匹配“value()”,“modify()”等文档的链接也会有所帮助.

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中不可能一次替换多个值,有几个选项:

>逐个使用循环和更新属性
> split data into temporary table/table variable,update and then merge into one xml
>使用xquery重建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

猜你在找的MsSQL相关文章