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

8 xml sql 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>'); 
Run Code Online (Sandbox Code Playgroud)

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

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

有任何想法吗?提前致谢.

编辑:

以前,如果我已经切碎到表中,这将是我使用的代码:

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)
Run Code Online (Sandbox Code Playgroud)

EDIT2:这是我期望的输出.

预期产出

Cod*_*ian 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)
Run Code Online (Sandbox Code Playgroud)

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

  • @ user1320771 - [使用APPLY](http://msdn.microsoft.com/en-us/library/ms175156(v = sql.105).aspx)是两个表单上的页面,包括差异. (2认同)