我在理解如何从SQL Server中的XML节点查询值时遇到问题。我有一个要读取的非常大而复杂的XML文件,我找到了几个针对特定情况提供建议的站点,尽管有些站点可以解决我的问题的简单版本,但是没有一个文件可以使用。>
以下代码是一些代码,该代码重新创建了XML文件的一部分供我学习语法,并且有效:
DECLARE @XML AS XML
set @XML = '
<creditscores>
<creditscore>
<score class="10">571</score>
<reasons>
<code>506</code>
<code>115</code>
<code>116</code>
<code>104</code>
</reasons>
</creditscore>
<creditscore>
<score class="2">586</score>
<reasons>
<code>105</code>
<code>302</code>
<code>112</code>
<code>104</code>
</reasons>
</creditscore>
</creditscores>
'
select @XML
;
--Credit Score Reason Codes
select
i.x.value('text()[1]', 'int') as [Code]
from @XML.nodes('/creditscores/creditscore/reasons/code') as i(x)
到目前为止,一切都很好,我得到了八行输出,但是现在我想在单独的列中捕获两个“分数”,并且还捕获分数的“类”。
我的输出应为三列:
class, score, code;
10, 571, 506;
10, 571, 115;
10, 571, 116;
10, 571, 104;
2, 586, 105;
2, 586, 302;
2, 586, 112;
2, 586, 104;
预先感谢,我没有找到有人在我的搜索中要求类似内容的示例。
编辑:添加了预期的输出
编辑2:我现在已经解决了如何获得“班级”的问题,但是我无法与“代码”同时获得,只能是“分数”。我使用了以下查询:
--Credit Scores
select
i.scores.value('@class', 'int') as Class,
i.scores.value('text()[1]', 'int') as Score
from @XML.nodes('/creditscores/creditscore/score') as i(scores)
这给了我以下输出:
Class, Score;
10, 571;
2, 586;
答案 0 :(得分:1)
您需要将FROM
中的另一个层添加到另一个节点。您可以使用CROSS APPLY
进行此操作。由于reasons
与score
处于同一层,因此一种方法是:
SELECT i.scores.value('@class', 'int') as Class,
i.scores.value('text()[1]', 'int') as Score,
s.code.value('text()[1]','int') AS Code
FROM @XML.nodes('/creditscores/creditscore/score') AS i(scores)
CROSS APPLY i.scores.nodes('../reasons/code') AS s(code);
但是,就个人而言,我会这样查询查询:
SELECT cs.score.value('@class', 'int') as Class,
cs.score.value('text()[1]', 'int') as Score,
cr.code.value('text()[1]','int') AS Code
FROM @XML.nodes('/creditscores/creditscore') AS i(creditscore)
CROSS APPLY i.creditscore.nodes('score') AS cs(score)
CROSS APPLY i.creditscore.nodes('reasons/code') AS cr(code);