Sql server 在sql server中读取XML重复标记
但我的查询在C1列中只返回NULLSql server 在sql server中读取XML重复标记,sql-server,xml,sql-server-2008,xml-parsing,sqlxml,Sql Server,Xml,Sql Server 2008,Xml Parsing,Sqlxml,但我的查询在C1列中只返回NULL 请帮帮我。提前感谢
请帮帮我。提前感谢
是
的属性,但您的上下文节点是
。在访问属性之前,您需要向XML树的上一级访问
节点。您可以执行。
以在xpath中访问当前节点的父节点:
C1 C2 C3
----------------
10 11.00 Closed
10 12.00 Closed
20 21.00 Closed
20 22.00 Closed
在SQL Server的XML查询中不应使用父轴。创建的查询计划将是O(n2)。对于XML中的每个节点,将检查XML中的所有节点 首先将
结果/现金
撕碎,然后在交叉申请中将账户
撕碎
选择C.X.value(“@number”,“varchar(max)”作为C1,
A.X.值(“@amt”,“varchar(max)”作为C2,
A.X.value(“@status”,“varchar(max)”作为C3
从@MainXml.nodes('result/cash')中取C(X)
交叉应用C.X.nodes(“帐户”)作为(X)
我不认为创建第二个XML变量有什么意义。直接使用@MainXML
。
虽然这听起来合乎逻辑,但我不确定这是否总是正确的。我想我见过使用
的查询。
有时比使用类似的几个应用程序的查询执行得更好,但我目前没有任何确切的示例。这就是说,测试它会很有趣。所以我不同意计划是O(n^2)
,它应该是线性的,因为每个节点只有一个parent@RomanPekar看看谢谢,回答得好!正如我所说,最好像您在这里那样分解xml,这是我第一次尝试,我只是记得我见过父节点工作得更好的情况,但同样,现在还没有例子。@RomanPekar也许您有xml索引?如果你这样做,计划就不同了。
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)
C1 C2 C3
----------------
10 11.00 Closed
10 12.00 Closed
20 21.00 Closed
20 22.00 Closed
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)