【发布时间】:2016-12-23 20:31:25
【问题描述】:
我目前有以下代码在名为 PARTY 的父节点下创建 XML。在 PARTY 节点内部是另一个称为 ROLE 的节点。我的问题是如何用 xquery 中的 [SequenceNr] 变量替换当前的 ROLE 节点,它只是说 ROLE。
我曾尝试在 @OutputXml 中进行替换,但没有奏效,我认为在 xquery 中应该有一个我不知道的简单方法。
当前代码:
WITH [PartyNodes] AS
(
SELECT (
SELECT [dbo].[XmlA](@Id),
[dbo].[XmlB](@Id)
FOR XML PATH(''),TYPE
) AS [AllTogether]
)
,[NumberedSequences] AS
(
SELECT 'PARTY' + CONVERT(NVARCHAR, ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) + 10) + '_ROLE1' AS [PartySequenceNr], -- party label
ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) + 10 AS [SequenceNr], -- party sequence
[T].[Party].[query]('.') AS [TheNode]
FROM [PartyNodes]
CROSS APPLY [AllTogether].[nodes]('/PARTY') AS T(Party)
)
SELECT @OutputXml = ( SELECT [TheNode].[query]('let $p:=/PARTY[1]
let $lbl:=sql:column("PartySequenceNr")
let $nr:=sql:column("SequenceNr")
return
<PARTY SequenceNumber="{$nr}" xlink_label="{$lbl}" >
{$p/*}
</PARTY>'
)
FROM [NumberedSequences]
FOR XML PATH(''),ROOT('PARTIES')
);
当前输出:
<PARTY SequenceNumber="1" xlink:label="PARTY1_ROLE1">
<INDIVIDUAL>
<NAME>
<FullName>Test</FullName>
</NAME>
</INDIVIDUAL>
<ROLES>
<ROLE>
<A>Test</A>
</ROLE>
</ROLES>
</PARTY>
期望的输出:
<PARTY SequenceNumber="1" xlink:label="PARTY1_ROLE1">
<INDIVIDUAL>
<NAME>
<FullName>Test</FullName>
</NAME>
</INDIVIDUAL>
<ROLES>
<ROLE SequenceNumber="1" xlink:label="PARTY1_ROLE1">>
<A>Test</A>
</ROLE>
</ROLES>
</PARTY>
【问题讨论】:
标签: sql-server xml sql-server-2008 xquery