从具有给定属性和值的xml中提取值,然后获取另一个属性的值

我有一个带有XML列类型的表。

如何找到名为“福特”的汽车节点的值?

此外,如果福特不在那,它也不会抛出错误。

    <cars>
      <car name="Honda" value="11" />
      <car name="Toyota" value="22" />
      <car name="Ford" value="3333" />
      <car name="Ferarri" value="444" />
    </cars>

我不确定如何设置节点属性的值,然后检查下一个“值”吗?

XmlColumn.value('/cars[1]/car[1]/@name["Ford"]/@value','nvarchar(max)')

我正在尝试执行上述操作,但这是一种错误的查询语法。

woshicgro 回答:从具有给定属性和值的xml中提取值,然后获取另一个属性的值

这里是另一个版本。我还向不带福特XML的表中添加了另一行。

  

SQL

-- DDL and sample data population,start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY,xml_data XML);
INSERT INTO @tbl (xml_data)
VALUES
(N'<cars>
      <car name="Honda" value="11" />
      <car name="Toyota" value="22" />
      <car name="Ford" value="3333" />
      <car name="Ferarri" value="444" />
    </cars>'),(N'<cars>
      <car name="Honda" value="11" />
      <car name="Toyota" value="22" />
      <car name="Ferarri" value="444" />
    </cars>');
-- DDL and sample data population,end

SELECT id,[xml_data].value('(/cars/car[@name="Ford"]/@value)[1]','INT') AS [value]
FROM @tbl AS tbl;
  

输出

+----+-------+
| id | value |
+----+-------+
|  1 | 3333  |
|  2 | NULL  |
+----+-------+
,

在提出问题时提供DDL和样本数据填充是一个好主意。您最初的XPath肯定已关闭。 在您的情况下,需要CROSS APPLY来实现所需的功能。检查一下:

  

SQL

-- DDL and sample data population,xml_data XML);
INSERT INTO @tbl (xml_data)
VALUES
(N'<cars>
      <car name="Honda" value="11" />
      <car name="Toyota" value="22" />
      <car name="Ford" value="3333" />
      <car name="Ferarri" value="444" />
    </cars>');
-- DDL and sample data population,end

SELECT col.value('@value','INT') AS [value]
FROM @tbl AS tbl
    CROSS APPLY tbl.[xml_data].nodes('/cars/car[@name="Ford"]') AS tab(col);
  

输出

+-------+
| value |
+-------+
|  3333 |
+-------+
本文链接:https://www.f2er.com/3149788.html

大家都在问