如何查询XML字段数据中的特定标签sql?
How to query a specific tag from XML field data in sql?
我有一个名为 Payload
的 xml
字段。它有这样的数据:
<FL>
<Head>
<TP>Nine11</TP>
<RB>Test</RB>
</Head>
<FL>
现在我想从 Head 查询 RB
,它的值等于例如'测试。
我做了这个,但除此之外我想不通了。
Select rlogs.PayLoadfrom rlogs
它显示了,我尝试连投。
Select CAST(rlogs.PayLoad as text) from RecordLogs rlogs
您可以在 XML 中使用 XPath 进行查询。如果我正确理解你的问题,你可以(例如)从你的 RecordLogs table 查询 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'
在等待您的回复期间,这里有一个基于一些假设的答案。
顺便说一下,您的 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);
Output
+--------+------+
| tp | rb |
+--------+------+
| Nine11 | Test |
+--------+------+
我有一个名为 Payload
的 xml
字段。它有这样的数据:
<FL>
<Head>
<TP>Nine11</TP>
<RB>Test</RB>
</Head>
<FL>
现在我想从 Head 查询 RB
,它的值等于例如'测试。
我做了这个,但除此之外我想不通了。
Select rlogs.PayLoadfrom rlogs
它显示了,我尝试连投。
Select CAST(rlogs.PayLoad as text) from RecordLogs rlogs
您可以在 XML 中使用 XPath 进行查询。如果我正确理解你的问题,你可以(例如)从你的 RecordLogs table 查询 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'
在等待您的回复期间,这里有一个基于一些假设的答案。
顺便说一下,您的 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);
Output
+--------+------+
| tp | rb |
+--------+------+
| Nine11 | Test |
+--------+------+