Как запросить указанный тег c из данных поля XML в sql? - PullRequest
0 голосов
/ 03 марта 2020

У меня есть поле xml с именем Payload. У него есть такие данные:

<FL>
    <Head>
      <TP>Nine11</TP>
      <RB>Test</RB>
    </Head>
<FL>

Теперь я хочу запросить RB из Голова , где его значение равно, например, 'Test.

Я сделал это, но за пределами этого я не могу понять.

Select  rlogs.PayLoadfrom rlogs

это показывает, и я попытался читать даже.

Select CAST(rlogs.PayLoad as text) from RecordLogs rlogs

Ответы [ 2 ]

1 голос
/ 03 марта 2020

В ожидании вашего ответа, вот ответ, основанный на некоторых предположениях.

Кстати, ваш XML не очень хорошо сформирован. Мне пришлось это исправить.

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, payload XML);
INSERT INTO @tbl (payload)
VALUES
(N'<FL>
    <Head>
      <TP>Nine11</TP>
      <RB>Test</RB>
    </Head>
</FL>');
-- DDL and sample data population, end

DECLARE @rb VARCHAR(20) = 'Test';

SELECT c.value('(TP/text())[1]', 'VARCHAR(30)') AS tp 
    , c.value('(RB/text())[1]', 'VARCHAR(30)') AS rb
FROM @tbl AS tbl
    CROSS APPLY tbl.payload.nodes('/FL/Head[RB=sql:variable("@rb")]') AS t(c);

Вывод

+--------+------+
|   tp   |  rb  |
+--------+------+
| Nine11 | Test |
+--------+------+
1 голос
/ 03 марта 2020

Вы можете использовать XPath для запроса в вашем XML. Если я правильно понимаю ваш вопрос, вы можете (например) запросить TP или весь XML из таблицы RecordLogs и отфильтровать столбец TP следующим образом:

Select rlogs.PayLoadFrom.value('(/FL/Head/TP)[1]', 'varchar(50)') TP, 
     CAST(rlogs.PayLoadFrom AS text) FL
FROM RecordLogs rlogs
WHERE rlogs.PayLoadFrom.value('(/FL/Head/RB)[1]', 'varchar(50)') = 'Test'
...