从 SQL 编辑 XML,插入 for 循环问题
Edit XML from SQL, insert in for-loop issue
我正在尝试使用 xQuery 修改 sql 服务器 table 中包含的 XML。此 XML 中的一个特定节点包含多个相同类型的节点。我想要做的是插入一个包含此节点顺序的节点元素作为整数。
这是初始情况
DECLARE @xml XML= N'
<parentNode>
<node>
</node>
<node>
</node>
<node>
</node>
</parentNode>'
这就是我想要实现的目标
<parentNode>
<node>
<Number> 1 </Number>
</node>
<node>
<Number> 2 </Number>
</node>
<node>
<Number> 3 </Number>
</node>
</parentNode>
我一直在尝试使用 for-loop "for $i in . return count(../*[. << $i]) + 1" 来做到这一点,它给出了每个节点的编号,但我未能插入这些编号。
关于如何实现这一点(最好使用 xQuery)有什么想法吗?
DECLARE @xml XML= N'
<parentNode>
<node>
</node>
<node>
</node>
<node>
</node>
</parentNode>'
declare @cnt int=0
declare @counter int=1
select
@cnt=@xml.value('count(/parentNode/node)','int')
declare @newXml nvarchar(max)
set @newXml=N'<parentNode>'
while (@counter <= @cnt)
begin
set @newXml = @newXml + '<node><Number>'+cast(@counter as varchar(10)) +'</Number></node>'
set @counter=@counter+1
end
set @newXml=@newXml+'</parentNode>'
select convert(xml,@newXml)
输出:
<parentNode>
<node>
<Number>1</Number>
</node>
<node>
<Number>2</Number>
</node>
<node>
<Number>3</Number>
</node>
</parentNode>
您可以先获取节点数,然后使用“XQUERY”插入那么多子节点数
DECLARE @xml XML= N'
<parentNode>
<node>
</node>
<node>
</node>
<node>
</node>
</parentNode>'
declare @nodes int = @xml.value('count(/parentNode/node)','INT')
declare @newnode XML
declare @nodeCount int =1
while @nodeCount <= @nodes
begin
set @newnode = ( select @nodeCount as 'Number' FOR XML PATH(''))
select @newnode
set @xml.modify('insert sql:variable("@newnode") into (/parentNode/node[sql:variable("@nodeCount")])[1]')
set @nodeCount = @nodeCount +1
end
select @xml
我正在尝试使用 xQuery 修改 sql 服务器 table 中包含的 XML。此 XML 中的一个特定节点包含多个相同类型的节点。我想要做的是插入一个包含此节点顺序的节点元素作为整数。
这是初始情况
DECLARE @xml XML= N'
<parentNode>
<node>
</node>
<node>
</node>
<node>
</node>
</parentNode>'
这就是我想要实现的目标
<parentNode>
<node>
<Number> 1 </Number>
</node>
<node>
<Number> 2 </Number>
</node>
<node>
<Number> 3 </Number>
</node>
</parentNode>
我一直在尝试使用 for-loop "for $i in . return count(../*[. << $i]) + 1" 来做到这一点,它给出了每个节点的编号,但我未能插入这些编号。
关于如何实现这一点(最好使用 xQuery)有什么想法吗?
DECLARE @xml XML= N'
<parentNode>
<node>
</node>
<node>
</node>
<node>
</node>
</parentNode>'
declare @cnt int=0
declare @counter int=1
select
@cnt=@xml.value('count(/parentNode/node)','int')
declare @newXml nvarchar(max)
set @newXml=N'<parentNode>'
while (@counter <= @cnt)
begin
set @newXml = @newXml + '<node><Number>'+cast(@counter as varchar(10)) +'</Number></node>'
set @counter=@counter+1
end
set @newXml=@newXml+'</parentNode>'
select convert(xml,@newXml)
输出:
<parentNode>
<node>
<Number>1</Number>
</node>
<node>
<Number>2</Number>
</node>
<node>
<Number>3</Number>
</node>
</parentNode>
您可以先获取节点数,然后使用“XQUERY”插入那么多子节点数
DECLARE @xml XML= N'
<parentNode>
<node>
</node>
<node>
</node>
<node>
</node>
</parentNode>'
declare @nodes int = @xml.value('count(/parentNode/node)','INT')
declare @newnode XML
declare @nodeCount int =1
while @nodeCount <= @nodes
begin
set @newnode = ( select @nodeCount as 'Number' FOR XML PATH(''))
select @newnode
set @xml.modify('insert sql:variable("@newnode") into (/parentNode/node[sql:variable("@nodeCount")])[1]')
set @nodeCount = @nodeCount +1
end
select @xml