SQL:如何获取 XML 数据类型中属性的值?

Posted

技术标签:

【中文标题】SQL:如何获取 XML 数据类型中属性的值?【英文标题】:SQL: How can I get the value of an attribute in XML datatype? 【发布时间】:2012-02-07 04:22:13 【问题描述】:

我的数据库中有以下 xml:

<email>
  <account language="en" ... />
</email>

我现在正在使用这样的东西:但仍然需要找到属性值。

 SELECT convert(xml,m.Body).query('/Email/Account')
 FROM Mail

如何使用 SQL 在我的 select 语句中获取 language 属性的值?

【问题讨论】:

【参考方案1】:

这在很大程度上取决于您查询文档的方式。不过,您可以这样做:

CREATE TABLE #example (
   document NText
);
INSERT INTO #example (document)
SELECT N'<email><account language="en" /></email>';

WITH XmlExample AS (
  SELECT CONVERT(XML, document) doc
  FROM #example
)
SELECT
  C.value('@language', 'VarChar(2)') lang
FROM XmlExample CROSS APPLY
     XmlExample.doc.nodes('//account') X(C);

DROP TABLE #example;

EDIT 更改您的问题后。

【讨论】:

我已经编辑了我的问题。 xml 在数据库中保存为 ntext。我先把它转成xml类型。 查看我的编辑,使用 ntext 输入和带有 CTE 的表格方法转换为 xml【参考方案2】:

使用 XQuery:

declare @xml xml =
'<email>
  <account language="en" />
</email>'

select @xml.value('(/email/account/@language)[1]', 'nvarchar(max)')

declare @t table (m xml)

insert @t values 
    ('<email><account language="en" /></email>'), 
    ('<email><account language="fr" /></email>')

select m.value('(/email/account/@language)[1]', 'nvarchar(max)')
from @t

输出:

en
fr

【讨论】:

这很完美!选择@xml.value('(/email/account/@language)[1]', 'nvarchar(max)') 谢谢! @KirillPolishchuk 如果根元素包含xmlns 属性怎么办?说,&lt;email xmlns="http://domain.com/ws/2016-08-07&gt;。在这种情况下,XQuery 返回NULL @InterfaceUnknown,这称为“默认命名空间”。像这样:在select 命令之前设置命名空间:WITH XMLNAMESPACES ('http://domain.com/ws/2016-08-07' as x )。然后您可以在选择查询中添加对此命名空间的引用:'(/x:email/x:account/@language)[1]'【参考方案3】:

这应该可行:

DECLARE @xml XML

SET @xml = N'<email><account language="en" /></email>'

SELECT T.C.value('@language', 'nvarchar(100)')
FROM @xml.nodes('email/account') T(C)

【讨论】:

【参考方案4】:

如果 xml 数据作为字符串列存储在 sql server 中,则使用 cast

select cast(your_field as XML)
       .value('(/email/account/@language)[1]', 'varchar(20)') 
from your_table

【讨论】:

以上是关于SQL:如何获取 XML 数据类型中属性的值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 XML 中获取元素属性的值

如何使用 xslt 获取 XML 的属性值和代码作为 html 的值

java中如何读取xml中数据。多节点的。给我一个例子,谢谢。

oracle的PL/SQL中如何根据节点名称直接获取xml某个节点的值

获取 XML 中属性的值

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