Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在sql server中读取XML重复标记_Sql Server_Xml_Sql Server 2008_Xml Parsing_Sqlxml - Fatal编程技术网

Sql server 在sql server中读取XML重复标记

Sql server 在sql server中读取XML重复标记,sql-server,xml,sql-server-2008,xml-parsing,sqlxml,Sql Server,Xml,Sql Server 2008,Xml Parsing,Sqlxml,但我的查询在C1列中只返回NULL 请帮帮我。提前感谢

但我的查询在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)