Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Sql Server列中的XML提取数据_Xml_Tsql - Fatal编程技术网

从Sql Server列中的XML提取数据

从Sql Server列中的XML提取数据,xml,tsql,Xml,Tsql,我刚刚发现(出于必要),TSQL具有一些从包含XML的列中提取数据的功能。我有一个Sql Server列,其中包含XML数据(尽管列类型不是XML,而是varchar)。我应该从列中提取数据的一个子集。简化的条目如下所示: declare @Table as table(id char(1), datacolumn xml) insert into @table select 'a', '<root><vnode v="5" /><vnode v="8" />

我刚刚发现(出于必要),TSQL具有一些从包含XML的列中提取数据的功能。我有一个Sql Server列,其中包含XML数据(尽管列类型不是XML,而是varchar)。我应该从列中提取数据的一个子集。简化的条目如下所示:

declare @Table as table(id char(1), datacolumn xml)

insert into @table
select 'a', '<root><vnode v="5" /><vnode v="8" /></root>'

insert into @table
select 'b', '<root><vnode v="7" /></root>'


id   datacolumn
---  -----------------------------------------
a    <root><vnode v="5" /><node v="8" /></root>
b    <root><vnode v="7" /></root>
我已经到了能够获得一些信息的地步……但是我缺少一些概念

select id, T.c.value('node[1]', 'varchar(100)') mdata
from @table
cross apply datacolumn.nodes('/root') AS T(c)
问题:

  • 这将获得vnode中的值(为空),但我需要标记为“v”的属性的值
  • 还有,因为我有[1],所以我得到了第一个节点……但我想要所有节点……但还没有找到这个概念
  • datacolumn.nodes('/root/vnode')
    返回每个
    XML
    /root/vnode
    的所有实例

    a
    中有
    2个
    ,在
    b
    中有
    1个

    value()
    返回相对于上一步返回的节点的
    XPath
    表达式的值


    由于要返回所讨论节点的属性值,只需在属性名称前面加上一个
    @
    (这表明您想要的是子属性,而不是子节点)。

    我知道这应该很简单,而且我会缺少一些基本的东西!谢谢
    select id, T.c.value('node[1]', 'varchar(100)') mdata
    from @table
    cross apply datacolumn.nodes('/root') AS T(c)
    
    SELECT  id, T.c.value('@v', 'NVARCHAR(MAX)')
    FROM    @table
    CROSS APPLY
            datacolumn.nodes('/root/vnode') AS T(c)