如何在 SQL Server 中查询 XML 列中的数据

Posted

技术标签:

【中文标题】如何在 SQL Server 中查询 XML 列中的数据【英文标题】:How to query data in XML column in SQL Server 【发布时间】:2016-07-16 11:14:43 【问题描述】:

我在xml 列中有这样的数据:

<product>
   <productID>1</productID>
   <productname>tea</productname>
</product>
<product>
   <productID>2</productID>
   <productname>coffee</productname>
</product>

我想将productname 的值更改为green tea,其中productID = 2

我正在使用:

UPDATE [dbo].ProductDocs
SET ProductDoc.modify('replace value of (/Product/ProductName)[2] with "NewName"')

但在这里它总是会改变第二个产品的价值。请告诉我如何使用productID查询。

【问题讨论】:

【参考方案1】:

使用谓词表达式按productID 值过滤product 元素,如下所示:

UPDATE [dbo].ProductDocs
SET ProductDoc.modify('
    replace value of (/product[productID=2]/productname/text())[1] with "NewName"
')

另请注意,如其他答案中所述,XML 和 XPath/XQuery 区分大小写。

【讨论】:

【参考方案2】:

首先,XML 区分大小写,XQuery 表达式也是如此。

现在你可以这样做了。

UPDATE [dbo].ProductDocs
SET ProductDoc.modify('replace value of (/product[productID=2]/productname/text())[1] with "GreenTea"')

【讨论】:

同意区分大小写。但是 XQuery 将触发“语法错误”,因为 /[some_expression] 不是有效的表达式。此外,productID/@Value 引用了productID 元素的value attribute,OP 的 XML 中没有这样的属性。 @har07 是的.. 我认为这是一个值,现在修复它。

以上是关于如何在 SQL Server 中查询 XML 列中的数据的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server XML 列中,如何验证相同的值是不是存在于多行中

如何从以 BLOB 类型存储在列中的 XML 中提取数据(通过 SQL 查询)

如何在SQL Server表列中查找相同值的行

动态获取 SQL Server 中不同列中的 XML 数据类型值

如何在 SQL Server 查询中排除周末?

如何从常规 SQL 查询中输出 XML?