【问题标题】:How to get a particular attribute from XML element in SQL Server如何从 SQL Server 中的 XML 元素获取特定属性
【发布时间】:2010-12-06 09:00:28
【问题描述】:

我在表格的一列中有类似以下 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 告诉我属性必须是节点的一部分。我可以找到很多选择子节点属性的示例,但没有关于兄弟属性的任何示例(如果这是正确的术语)。

任何帮助将不胜感激。

【问题讨论】:

    标签: sql-server xml xpath xquery


    【解决方案1】:

    根据您的 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'
    

    【讨论】:

    • 为什么 xmlCol.value('(/container/param[@name="paramB"]/@value)[1]', 'varchar(50)') 对我不起作用,而只是.value('@value', 'vharchar(50)') 有效吗?嗯嗯。
    【解决方案2】:

    尝试使用.value 函数而不是.query

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

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

    马克

    【讨论】:

    • 我在字段中有动态节点,例如 通过使用您的给定查询,我能够根据索引阅读。意味着当我将索引设为 1 时,它将显示 2,当我将索引设为 2 时,它将显示 5,但我需要两个节点。所以你能建议我怎么做吗!
    • 我在将它用于布尔值时遇到了麻烦。我尝试使用 'boolean' 和 'System.Boolean' 作为第二个参数并收到错误。如果我做 varchar 它返回所有空值。我的 xml 行看起来像:
    • @Zeb:SQL Server 没有 boolean 类型 - 它有 BIT - 或者您可能只需要将其读取为 INT 然后进一步处理它
    • 如果,我们不确定 xml 中属性的路径。但确定xml标签。?意味着我有 xml 列,但每个 xml 都不同,我确信我的 xml 包含 标签,那么我们如何获取它的值..?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多