【发布时间】:2019-12-22 10:14:12
【问题描述】:
我的 SQL 表列具有如下 xml 数据
我正在尝试根据特定标签值 ( age ) 查找元素。但是,我的 xml 值具有前导空格。所以,它在条件上失败了。请指导我处理这个。
例子:
declare @age2 varchar(40)='23'
declare @ageNew2 varchar(40)='43'
declare @xmldata xml='<Root>
<Identification Name="John" Family="Brown"><Age>40</Age><name>xxx</name></Identification>
<Identification Name="Smith" Family="Johnson"><Age>35</Age><name>xxx</name></Identification>
<Identification Name="Jessy" Family="Albert"><Age>60</Age><name>xxx</name></Identification>
<Identification Name="Mike" Family="Brown"><Age>23</Age><name>xxx</name></Identification>
<Identification Name="Sarah" Family="Johnson"><Age>40</Age><name>xxx</name></Identification>
<Identification Name="Jessy" Family="Albert"><Age>40</Age><name>xxx</name></Identification>
<Identification Name="Mike" Family="Brown"><Age>23 </Age><name>xxx</name></Identification>
<Identification Name="Sarah" Family="Johnson"><Age>45</Age><name>xxx</name></Identification>
</Root>'
declare @dynamicData varchar(max)
set @dynamicData=' declare @xml varchar(max) ='''+Convert(varchar(max),@xmldata)+''' '
set @dynamicData +=' declare @xmld xml=convert(xml,@xml) '
set @dynamicData +=' declare @age varchar(55) ='''+@age2+''''
set @dynamicData +=' declare @ageNew varchar(55) ='''+@ageNew2+''''
DECLARE @nodeCount int
DECLARE @i int
SET @i = 0
SELECT @nodeCount = @xmldata.value('count(/Root/Identification/Age)','int')
WHILE (@i < @nodeCount)
BEGIN
set @dynamicData+=' set @xmld.modify(''replace value of (/Root/Identification[Age=sql:variable("@age")]/name/text())['+convert(varchar(10),@i)+'] with "'+@ageNew2+'"'') '
SET @i = @i + 1
END
set @dynamicData+=' select convert(xml,@xmld) '
exec(@dynamicData)
在这里,我正在尝试将 23 岁更新为 43 岁。所以,按照我的预期。它应该替换两个地方。但是,它单独替换第一个。因为,第二个有空间。 所以,请指导我。谢谢
【问题讨论】:
-
请edit您的问题包括样本数据和期望的结果。
-
看看stackoverflow.com/questions/12488213/how-to-use-like-in-xpath,尤其是endswith的解决方法可能会有所帮助
-
@ZoharPeled 请检查。我已经更新了
标签: sql sql-server xml