8

我目前有这段代码,它将 XML 存储到一个名为 data 的 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,该变量被声明为 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)

EDIT2:这是我期望的输出。

预期产出

4

1 回答 1

11

你需要使用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 集合。

于 2012-06-28T13:39:16.190 回答