代码之家  ›  专栏  ›  技术社区  ›  My Other Me

如何从SQLServer中的XML元素中获取特定属性

  •  32
  • My Other Me  · 技术社区  · 16 年前

    我在表的列中有类似于以下XML的内容:

    <?xml version="1.0" encoding="utf-8"?>
    <container>
      <param name="paramA" value="valueA" />
      <param name="paramB" value="valueB" />
      ...
    </container>
    

    我试图通过TSQL从XML中获取valueB部分

    到目前为止,我得到了正确的节点,但现在我不知道如何获得属性。

    select xmlCol.query('/container/param[@name="paramB"]') from LogTable
    

    我想我可以在末尾添加/@value,但是SQL告诉我属性必须是节点的一部分。我可以找到很多选择子节点属性的例子,但是没有关于同级心房的例子(如果这是正确的术语)。

    任何帮助都将不胜感激。

    3 回复  |  直到 16 年前
        1
  •  73
  •   marc_s MisterSmith    16 年前

    尝试使用 .value .query

    SELECT 
      xmlCol.value('(/container/param[@name="paramB"]/@value)[1]', 'varchar(50)') 
    FROM  
      LogTable
    

    XPath表达式可能会返回节点列表,因此需要添加 [1] 指向该潜在列表,告诉SQL Server使用其中的第一个条目(是的,该列表基于1,而不是基于0)。作为第二个参数,您需要指定值应转换为什么类型-这里只是猜测。

    马克

        2
  •  10
  •   user189459 user189459    16 年前

    根据xml的实际结构,在其上放置一个视图可能会很有用,以便使用“常规”sql更容易使用

    CREATE VIEW vwLogTable
    AS
    SELECT
        c.p.value('@name', 'varchar(10)') name,
        c.p.value('@value', 'varchar(10)') value
    FROM
        LogTable
        CROSS APPLY x.nodes('/container/param') c(p)
    GO
    
    
    -- now you can get all values for paramB as...
    SELECT value FROM vwLogTable WHERE name = 'paramB'