【问题标题】:SQL: How can I get the value of an attribute in XML datatype?SQL:如何获取 XML 数据类型中属性的值?
【发布时间】: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 属性的值?

【问题讨论】:

    标签: sql xml sql-server-2008 tsql xquery


    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-01
        相关资源
        最近更新 更多