【问题标题】:Get the names of attributes from an element in a SQL XML column从 SQL XML 列中的元素获取属性名称
【发布时间】:2008-10-27 21:11:25
【问题描述】:

对于这个 xml(在 SQL 2005 XML 列中):

<doc>
 <a>1</a>
 <b ba="1" bb="2" bc="3" />
 <c bd="3"/>
<doc>

我希望能够检索属性的名称(ba、bb、bc、bd)而不是SQL Server 2005 中的值。好吧,XPath 确实允许使用 name() 进行此操作,但 SQL 不支持此操作。这是我对在 SQL 中使用 XML 的主要抱怨;您必须弄清楚 XML/Xpath/XQuery 规范的哪些部分在其中。

我能想到的唯一方法是构建一个 CLR proc,它将 XML 加载到 XML 文档 (iirc) 中并运行 XPath 以提取节点的名称。我愿意接受这里的建议。

【问题讨论】:

  • 哇,在我问了这个问题 7.5 年之后,它得到了支持。

标签: .net sql-server xml xpath sqlclr


【解决方案1】:
DECLARE @xml as xml

SET @xml = 
'<doc>
 <a>1</a>
 <b ba="1" bb="2" bc="3" />
 <c bd="3"/>
</doc>'

SELECT DISTINCT
 CAST(Attribute.Name.query('local-name(.)') AS VARCHAR(100)) Attribute,
 Attribute.Name.value('.','VARCHAR(100)') Value
FROM @xml.nodes('//@*') Attribute(Name)

返回:

属性值

ba 1

bb 2

公元前3

bd 3

【讨论】:

    【解决方案2】:
    DECLARE @xml as xml
    DECLARE @path as varchar(max)
    DECLARE @index int, @count int
    
    SET @xml = 
    '<doc>
     <a>1</a>
     <b ba="1" bb="2" bc="3" />
     <c bd="3"/>
    </doc>'
    
    
    
    SELECT @index = 1
    
    SET @count = @xml.query('count(/doc/b/@*)').value('.','int')
    
    WHILE @index <= @count 
    BEGIN
        SELECT  @xml.value('local-name((/doc/b/@*[sql:variable("@index")])[1])', 'varchar(max)')
        SET @index = @index + 1
    END
    

    对于元素“b”

    返回

    • 巴
    • bb
    • 公元前

    您可以构建一个循环来获取 xml 中每个元素的属性。

    顺便说一句 示例中的 XML 应在关闭 doc 标记时关闭。

    【讨论】:

      【解决方案3】:

      这个:

      declare @xml as xml
      
      set @xml = 
      '<doc>
       <a>1</a>
       <b ba="1" bb="2" bc="3" />
       <c bd="3"/>
      </doc>'
      
      select @xml.query('
          for $attr in /doc/b/@*
          return local-name($attr)') 
      

      返回:

      ba bb bc

      【讨论】:

        【解决方案4】:
        Declare @xml Xml = '<doc><a>1</a><b ba="1" bb="2" bc="3" /><c bd="3"/></doc>'
        
        Select n.value('local-name(.)', 'varchar(max)')  from @xml.nodes('/doc/*/@*') a(n)
        

        返回 巴 bb 公元前 bd

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-10-10
          • 2021-03-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-22
          • 1970-01-01
          相关资源
          最近更新 更多