我想替换元素标签中的值,具体取决于它的值,以及另一个元素的值(与所述元素处于同一级别),两个元素都在同一个父元素标签内(每个父元素)标签由于其自己的 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”且数据类型为“Float”的所有属性的格式值“n0”替换为“f2”。
-谢谢
最佳答案
在 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
如果您的 xml 包含命名空间,我发现最简单的更新方法是声明 default
命名空间:
;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
关于sql - 修改(替换)条件 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19585319/