【问题标题】:How do I extract a value from an XML column in SQL Server如何从 SQL Server 中的 XML 列中提取值
【发布时间】:2020-08-06 14:10:42
【问题描述】:

我在表 CSE_ARCHIVEDCREDITSCORE 中有一个 SCORERESULTS 列。

分数结果是一个 XML 列。

<ScoringEngine>
  <Profile id="Navigation" version="1" num="4" uniqueId="8bcf8a8b9efc4e5dad1d87510cfe6a64">
.
.
.
    <Tool id="Payment To Income Ratio" version="1" old_id="Pmt_To_Income">
      <Rule id="PaymentIncomeRatio" version="1" old_id="PTI">
        <Row uniqueId="0fb11598c4224e4c97cf2afcc4e34b54" order="6" id="0">
          <Column order="1" op="RNG2" start="0.18" end="0.2" title="Payment To Income Ratio">0.190325139</Column>
          <Action name="Record Value" value="1.42085235920852" fieldName="LO_R_PMT_TO_INCOME" />
        </Row>
      </Rule>
      <RecordedValue>
        <Value value="1.42085235920852" fieldName="LO_R_PMT_TO_INCOME" />
      </RecordedValue>
    </Tool>
    <Tool id="RecentLoans" version="2">
      <Rule id="RecentLoans" version="2" old_id="RecentLoans" />
    </Tool>
.
.
.
  </Profile>
</ScoringEngine>

我正在尝试从 XML 行中获取值 0.190325139:&lt;Column order="1" op="RNG2" start="0.18" end="0.2" title="Payment To Income Ratio"&gt;0.190325139&lt;/Column&gt; 我对如何拉它一无所知。我不熟悉 XML,也不熟悉如何很好地导航它。

【问题讨论】:

  • 谢谢。不幸的是,它并没有真正帮助我。我发现我需要使用 scoreresults.value() 来访问 XML。我更大的问题是我对导航 XML 以实际返回我真正想要的部分了解不够。
  • 每个 xml 是否只有 1 个名称为 的标签?
  • 据我所知,是的。

标签: sql sql-server xml


【解决方案1】:

您可以使用以下查询。确保 SCORERESULTS 列的类型为 XML。

SELECT SCORERESULTS.value('(ScoringEngine/Profile/Tool/Rule/Row/Column)[1]', 'nvarchar(MAX)') AS result
FROM CSE_ARCHIVEDCREDITSCORE

如果列不是 XML 类型,请使用以下查询

SELECT CAST(SCORERESULTS AS XML).value('(ScoringEngine/Profile/Tool/Rule/Row/Column)[1]', 'nvarchar(MAX)') AS result
FROM CSE_ARCHIVEDCREDITSCORE

【讨论】:

  • 这几乎行得通。我误解了你关于 标签的问题。每个 XML 没有一个,但每个 标记都有一个,该工具包含不同的变量。感谢您提供的帮助。
  • 您现在面临的问题是什么?
  • 我误解了你的问题。有多个 标签,每个 一个标签,所以我只需要缩小到正确的工具 Payment To Income Ratio
  • 我一直在努力,能够到达我需要的地方。感谢您的帮助。
  • @RobertRichardson,很高兴这个解决方案很有帮助。
【解决方案2】:

您可以尝试以下方法。

XPath 谓词过滤掉不需要的&lt;Tool&gt; 元素。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, xmldata XML);
INSERT INTO @tbl (xmldata)
VALUES
(N'<ScoringEngine>
    <Profile id="Navigation" version="1" num="4"
             uniqueId="8bcf8a8b9efc4e5dad1d87510cfe6a64">
        <Tool id="Payment To Income Ratio" version="1" old_id="Pmt_To_Income">
            <Rule id="PaymentIncomeRatio" version="1" old_id="PTI">
                <Row uniqueId="0fb11598c4224e4c97cf2afcc4e34b54" order="6"
                     id="0">
                    <Column order="1" op="RNG2" start="0.18" end="0.2"
                            title="Payment To Income Ratio">0.190325139</Column>
                    <Action name="Record Value" value="1.42085235920852"
                            fieldName="LO_R_PMT_TO_INCOME"/>
                </Row>
            </Rule>
            <RecordedValue>
                <Value value="1.42085235920852" fieldName="LO_R_PMT_TO_INCOME"/>
            </RecordedValue>
        </Tool>
        <Tool id="RecentLoans" version="2">
            <Rule id="RecentLoans" version="2" old_id="RecentLoans"/>
        </Tool>
    </Profile>
</ScoringEngine>');
-- DDL and sample data population, end

SELECT tbl.ID
    , c.value('(Rule/Row/Column/text())[1]','DECIMAL(10,8)') AS [value]
FROM @tbl AS tbl
    CROSS APPLY xmldata.nodes('/ScoringEngine/Profile/Tool[@id="Payment To Income Ratio"]') AS t(c);

输出

+----+------------+
| ID |   value    |
+----+------------+
|  1 | 0.19032514 |
+----+------------+

【讨论】:

    猜你喜欢
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多