0

我有一个xml名为 的字段Payload。它有这样的数据:

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

现在我想RBHead查询它的值等于例如'Test.

我这样做了,但除此之外我无法弄清楚。

Select  rlogs.PayLoadfrom rlogs

它显示,我什至尝试铸造。

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

2 回答 2

1

您可以使用 XPath 在您的 XML 中进行查询。如果我正确理解您的问题,您可以(例如)从 RecordLogs 表中查询 TP 或整个 XML,并像这样过滤 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'
于 2020-03-03T14:35:50.680 回答
1

在等待您的回复时,这里是基于一些假设的答案。

顺便说一句,您的 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 |
+--------+------+
于 2020-03-03T15:03:13.070 回答