将表列中的XML分解为SQL Server中的视图

时间:2012-06-28 13:21:20

标签: sql xml views shred

我目前有这个代码,它将XML存储到一个名为Storage的XML类型列中,名为Storage。

    CREATE TABLE Storage
(
    ID INT IDENTITY(1,1) PRIMARY KEY,
    data XML NOT NULL
)

GO

INSERT INTO Storage(data) 
VALUES('<footballteams>   
    <team manager="Benitez">     
        <name>Liverpool</name>     
        <ground>Anfield</ground>   
    </team>   
    <team manager="Mourinho">     
        <name>Chelsea</name>     
        <ground>Stamford Bridge</ground>   
    </team>   
    <team manager="Wenger">     
         <name>Arsenal</name>     
         <ground>Highbury</ground>   
    </team> 
</footballteams>'); 

我想创建一个名为Football View的视图,它将数据分解并以表格形式显示:FootballView(TeamName,Manager,Ground)。

我之前使用.nodes()方法将完整文档粉碎成表格列,但在创建视图时似乎更具挑战性(我有使用视图的理由)。问题是以前我只是在一个变量@input上调用.nodes,这个变量是DECLARE,因为xml ='xmlcontent'但是有了视图,这是无法完成的,我想解析存储表列中包含的XML。 / p>

有什么想法吗?提前谢谢。

编辑:

以前,如果我已经粉碎成表格,那么这就是我使用的代码:

SELECT     
        TeamName = Foot.value('(name)[1]', 'varchar(100)'),     
        Manager = Foot.value('(@manager)', 'varchar(100)'),     
        Ground = Foot.value('(ground)[1]', 'varchar(100)')   
FROM     
        @input.nodes('/footballteams/team') AS Tbl(Foot)

EDIT2:这是我期望的输出。

Expected Output

1 个答案:

答案 0 :(得分:10)

您需要使用CROSS APPLY

SELECT     
        TeamName = Foot.value('(name)[1]', 'varchar(100)'),     
        Manager = Foot.value('(@manager)', 'varchar(100)'),     
        Ground = Foot.value('(ground)[1]', 'varchar(100)')   
FROM    
    Storage S 
        CROSS APPLY data.nodes('/footballteams/team') AS Tbl(Foot)

CROSS APPLYOUTER APPLY允许您有效地加入当前数据集中的XML集合。