Как извлечь значение из столбца XML на сервере SQL - PullRequest
0 голосов
/ 06 августа 2020

У меня есть столбец SCORERESULTS в таблице CSE_ARCHIVEDCREDITSCORE.

Результаты оценки - это столбец 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>

Я пытаюсь получить значение 0,190325139 из XML line: <Column order="1" op="RNG2" start="0.18" end="0.2" title="Payment To Income Ratio">0.190325139</Column> Я понятия не имею, как его вытащить. Я не знаком с XML или с тем, как правильно в нем ориентироваться.

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Вы можете попробовать следующий подход.

Предикат XPath отфильтровывает ненужные <Tool> элементы.

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 |
+----+------------+
0 голосов
/ 06 августа 2020

Вы можете использовать запрос ниже. Убедитесь, что столбец 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...