【问题标题】:How to select every tag from XML document in SQL Server 2008?如何从 SQL Server 2008 中的 XML 文档中选择每个标签?
【发布时间】:2012-08-13 13:02:11
【问题描述】:

我正在寻找是否可以在 T-SQL 中进行查询,该查询将从我的 XML 文档的 每个 标记中选择值。

我不知道可以有多少个标签,也不知道它们的名字,因为它应该是动态的... 这不是重要的输出格式(可以稍后操作),唯一重要的是我从每个标签中获取数据:)

谢谢

【问题讨论】:

    标签: sql xml sql-server-2008


    【解决方案1】:

    你可以试试这样的:

    DECLARE @input XML = '..... add your XML here........'
    
    SELECT 
        NodeName = Nod.value('local-name(.)', 'varchar(50)'),
        NodeValue = Nod.value('.', 'varchar(50)')
    FROM @input.nodes('//*') AS TBL(Nod)
    

    这将在您的 XML 中列出所有节点 - 名称和值。

    警告:我只是在这里随机选择了varchar(50),作为 XML 节点元素的数据类型。如果这不适合您 - 根据需要进行调整!由于您要一次将它们全部转换,因此您必须将它们全部转换为相同的数据类型 - 而varchar 似乎是一个相当安全的选择:-)

    【讨论】:

      【解决方案2】:
      declare @xml xml
      
      select 
          x.n.query('local-name(.)'),
          x.n.value('(text())[1]','varchar(100)')
      from @xml.nodes('//.') x(n)
      

      【讨论】:

        【解决方案3】:

        您可以使用openxml 获取edge 表。它将为您提供节点值以及属性值。如果您有复杂的 XML,其中包含节点和文本的混合,您会将值拆分为单独的行。

        declare @xml xml
        
        set @xml = 
        '<root Attrib="RootAttribute">
          <item>Value item 1</item>
          <item>
            Value item 2
              <subitem>sub value in 2</subitem>
            More text in item 2
          </item>
         </root>'
        
        declare @idoc int
        exec sp_xml_preparedocument @idoc out, @xml
        
        select *
        from openxml(@idoc, '')
        
        exec sp_xml_removedocument @idoc
        

        结果:

        id parentid nodetype localname prefix namespaceuri datatype prev text
        0  NULL     1        root      NULL   NULL         NULL     NULL NULL
        2  0        2        Attrib    NULL   NULL         NULL     NULL NULL
        8  2        3        #text     NULL   NULL         NULL     NULL RootAttribute
        3  0        1        item      NULL   NULL         NULL     NULL NULL
        9  3        3        #text     NULL   NULL         NULL     NULL Value item 1
        4  0        1        item      NULL   NULL         NULL     3    NULL
        6  4        3        #text     NULL   NULL         NULL     NULL Value item 2
        5  4        1        subitem   NULL   NULL         NULL     6    NULL
        10 5        3        #text     NULL   NULL         NULL     NULL sub value in 2
        7  4        3        #text     NULL   NULL         NULL     5    More text in item 2
        

        【讨论】:

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