从SQL Server数据库中提取列中的XML

时间:2017-08-23 22:47:30

标签: sql-server xml

我已阅读了数十篇帖子并尝试了大量的SQL查询来尝试解决这个问题。遗憾的是,我不是SQL专家(甚至不是新手),也不是XML专家。我理解SQL的基本查询,并且主要理解XML标签。

我正在尝试查询数据库表,并让数据显示包含XML的列的值列表。我会给你一个数据的例子。我不会为你所做的一切负担。

以下是我需要的列内部字段的示例。所以这只是一行,我需要查询整个表以获取我需要的所有数据。

当我从[表名]中选择*时,它返回数百行,当我在一行中双击“文档”的列名时,我得到了我需要的信息。

看起来像这样:

<code_set xmlns="">
    <name>ExampleCodeTable</name>
    <last_updated>2010-08-30T17:49:58.7919453Z</last_updated>
    <code id="1" last_updated="2010-01-20T17:46:35.1658253-07:00" 
          start_date="1998-12-31T17:00:00-07:00" 
          end_date="9999-12-31T16:59:59.9999999-07:00">
        <entry locale="en-US" name="T" description="Test1" />
    </code>
    <code id="2" last_updated="2010-01-20T17:46:35.1658253-07:00" 
          start_date="1998-12-31T17:00:00-07:00" 
          end_date="9999-12-31T16:59:59.9999999-07:00">
        <entry locale="en-US" name="Z" description="Test2" />
    </code>
    <displayExpression>[Code] + ' - ' + [Description]</displayExpression>
    <sortColumn>[Description]</sortColumn>
</code_set>

理想情况下,我会编写它,以便在表上运行查询并生成如下结果:

Code     Description
--------------------
(Data)   (Data)

有什么想法吗?它甚至可能吗?我尝试过的很多东西总是以堆栈的形式发布,要么返回Nulls要么失败。

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

尝试这样的事情:

SELECT
    CodeSetId = xc.value('@id', 'int'),
    Description = xc.value('(entry/@description)[1]', 'varchar(50)')
FROM
    dbo.YourTableNameHere
CROSS APPLY
    YourXmlColumn.nodes('/code_set/code') AS XT(XC)

这基本上使用内置的XQuery来获取内存中的#34;表(XT)包含一个列(XC),每个列包含一个XML片段,代表<code>根节点中的每个<code_set>节点。

一旦拥有了这些XML片段,就可以使用.value() XQuery运算符来&#34;到达&#34;并从中获取一些信息,例如它的@idid的名称属性)或所包含的@description子元素的<entry>属性。

答案 1 :(得分:0)

以下查询将读取每行中的xml字段,然后将某些值分解为表格结果集。

SELECT
      -- get attribute [attribute name] from the parent node
      parent.value('./@attribute name','varchar(max)') as ParentAttributeValue,
      -- get the text value of the first child node
      child.value('./text()', 'varchar(max)') as ChildNodeValueFromFirstChild,
      -- get attribute attribute [attribute name] from the first child node
      child.value('./@attribute name', 'varchar(max)') as ChildAttributeValueFromFirstChild
FROM  
     [table name] 
      CROSS APPLY
     -- create a handle named parent that references that <parent node> in each row
     [xml field name].nodes('//xpath to parent name') AS ParentName(parent) 
     CROSS APPLY
     -- create a handle named child that references first <child node> in each row
     parent.nodes('(xpath from parent/to child)[0]') AS FirstChildNode(child)
GO

请提供您希望从XML中粉碎的确切值,以获得更精确的答案。