在 sql 服务器中读取 XML 个重复标签
Reading XML repeated tags in sql server
Declare @MainXml XML =
'<?xml version="1.0" encoding="utf-8"?>
<result>
<cash number="10">
<account amt="11.00" status="Closed"/>
<account amt="12.00" status="Closed"/>
</cash>
<cash number="20">
<account amt="21.00" status="Closed"/>
<account amt="22.00" status="Closed"/>
</cash>
</result>'
我正在使用以下查询读取数据
Declare @Innerxml xml;
SELECT @Innerxml = T.c.query('<result>{/result/cash}</result>')
FROM @MainXml.nodes('result') T(c)
SELECT
Result.Claim.value('(./@number)[1]','varchar(max)') as C1,
Result.Claim.value('(./@amt)[1]','varchar(max)') as C2,
Result.Claim.value('(./@status)[1]','varchar(max)') as C3
From @Innerxml.nodes('/result/cash/account') Result(Claim)
我想读取 xml 并存储在数据库中,如下所示。
C1 C2 C3
----------------
10 11.00 Closed
10 12.00 Closed
20 21.00 Closed
20 22.00 Closed
但我的查询 returns 在 C1 列中只有 NULL
请在这里帮助我。提前致谢
@number
是 <cash>
的属性,但您的上下文节点是 <account>
。在访问属性之前,您需要在 XML 树上向上移动一级才能到达 <cash>
节点。您可以执行 ..
以获取 xpath 中当前节点的父节点:
SELECT
Result.Claim.value('(../@number)[1]','varchar(max)') as C1,
Result.Claim.value('(./@amt)[1]','varchar(max)') as C2,
Result.Claim.value('(./@status)[1]','varchar(max)') as C3
From @Innerxml.nodes('/result/cash/account') Result(Claim)
您不应在 SQL 服务器的 XML 查询中使用父轴。创建的查询计划将是 O(n2)。对于 XML 中的每个节点,检查 XML 中的所有节点。
先在 result/cash
上撕碎,然后在交叉涂抹中在 account
上撕碎。
select C.X.value('@number', 'varchar(max)') as C1,
A.X.value('@amt', 'varchar(max)') as C2,
A.X.value('@status', 'varchar(max)') as C3
from @MainXml.nodes('result/cash') as C(X)
cross apply C.X.nodes('account') as A(X)
我看不出创建第二个 XML 变量有什么意义。直接使用@MainXML
。
Declare @MainXml XML =
'<?xml version="1.0" encoding="utf-8"?>
<result>
<cash number="10">
<account amt="11.00" status="Closed"/>
<account amt="12.00" status="Closed"/>
</cash>
<cash number="20">
<account amt="21.00" status="Closed"/>
<account amt="22.00" status="Closed"/>
</cash>
</result>'
我正在使用以下查询读取数据
Declare @Innerxml xml;
SELECT @Innerxml = T.c.query('<result>{/result/cash}</result>')
FROM @MainXml.nodes('result') T(c)
SELECT
Result.Claim.value('(./@number)[1]','varchar(max)') as C1,
Result.Claim.value('(./@amt)[1]','varchar(max)') as C2,
Result.Claim.value('(./@status)[1]','varchar(max)') as C3
From @Innerxml.nodes('/result/cash/account') Result(Claim)
我想读取 xml 并存储在数据库中,如下所示。
C1 C2 C3
----------------
10 11.00 Closed
10 12.00 Closed
20 21.00 Closed
20 22.00 Closed
但我的查询 returns 在 C1 列中只有 NULL 请在这里帮助我。提前致谢
@number
是 <cash>
的属性,但您的上下文节点是 <account>
。在访问属性之前,您需要在 XML 树上向上移动一级才能到达 <cash>
节点。您可以执行 ..
以获取 xpath 中当前节点的父节点:
SELECT
Result.Claim.value('(../@number)[1]','varchar(max)') as C1,
Result.Claim.value('(./@amt)[1]','varchar(max)') as C2,
Result.Claim.value('(./@status)[1]','varchar(max)') as C3
From @Innerxml.nodes('/result/cash/account') Result(Claim)
您不应在 SQL 服务器的 XML 查询中使用父轴。创建的查询计划将是 O(n2)。对于 XML 中的每个节点,检查 XML 中的所有节点。
先在 result/cash
上撕碎,然后在交叉涂抹中在 account
上撕碎。
select C.X.value('@number', 'varchar(max)') as C1,
A.X.value('@amt', 'varchar(max)') as C2,
A.X.value('@status', 'varchar(max)') as C3
from @MainXml.nodes('result/cash') as C(X)
cross apply C.X.nodes('account') as A(X)
我看不出创建第二个 XML 变量有什么意义。直接使用@MainXML
。