我指的是How to get a particular attribute from XML element in SQL Server .
我没有包含节点值的特定属性,而是根据我要查找的属性来查找节点的值。
我从 SQL 表中的 XML 列中进行选择,但为了简单起见,我可以提供以下示例:
DECLARE @xml xml = CONVERT(XML, '<?xml version="1.0" encoding="UTF-8"?>
<alert>
<hits>
<elem name="hit">
<elem name="scoreFactors">
<elem name="scoreFactors">
<elem name="factorId">FactorID 1</elem>
<elem name="factorDesc">FactorDesc 1</elem>
<elem name="factorValue">FactorValue 1</elem>
<elem name="factorScore">FactorScore 1</elem>
<elem name="factorImpact">FactorImpact 1</elem>
</elem>
<elem name="scoreFactors">
<elem name="factorId">FactorID 2</elem>
<elem name="factorDesc">FactorDesc 2</elem>
<elem name="factorValue">FactorValue 2</elem>
<elem name="factorScore">FactorScore 2</elem>
<elem name="factorImpact">FactorImpact 2</elem>
</elem>
</elem>
</elem>
</hits>
</alert>')
SELECT @xml.value('(/alert/hits/elem/elem[@name="factorDesc"])[1]', 'nvarchar(max)')
我返回的只是一个NULL
值,但我期望有 2 行分别以 FactorDesc 1
和 FactorDesc 2
作为值.
我做错了什么?
最佳答案
您要查找的属性位于 <elem>
的第四级别。 - 所以你需要使用这个XPath:
SELECT @xml.value('(/alert/hits/elem/elem/elem/elem[@name="factorDesc"])[1]', 'nvarchar(max)')
或者使用此 XPath(但是注意:如果您的 XML 有大量 <elem>
节点,这可能会 killer 性能!您已经警告!)
SELECT @xml.value('(/alert/hits//elem[@name="factorDesc"])[1]', 'nvarchar(max)')
更新:如果您想要所有带有 factorDesc
的节点名称,您可以使用类似以下内容:
;WITH Shredded AS
(
SELECT
ElemName = xc.value('@name', 'varchar(50)'),
ElemValue = xc.value('.', 'varchar(50)')
FROM
@xml.nodes('/alert/hits//elem') AS XT(XC)
)
SELECT *
FROM Shredded
WHERE Shredded.ElemName = 'factorDesc'
关于sql-server - SQL XPath 查询按属性查找节点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31936911/