XML到SQL Server代码问题

时间:2018-08-29 11:15:26

标签: sql-server xml

我在理解如何从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;

1 个答案:

答案 0 :(得分:1)

您需要将FROM中的另一个层添加到另一个节点。您可以使用CROSS APPLY进行此操作。由于reasonsscore处于同一层,因此一种方法是:

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);