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

问题描述:

我目前有一个将XML存储到名为“存储”的表中的称为数据的XML类型列中的代码。将表列中的XML分解为SQL Server中的视图

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>'); 

我想创建一个名为足球查看视图,其撕碎在表单中的数据并显示:FootballView(TeamName,经理,地)。

我已经使用.nodes()方法将表单中的所有文档全部分解成了表格列,但是在创建视图时(我有我使用视图的原因)它似乎更具挑战性。问题是,以前我只是调用了一个变量@input,其中的变量@input被声明为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:这是我所期望的输出。

Expected Output

+0

您可以将用于碎化的代码发布到列中,还可以将其转换成如何转换。 –

+1

请参阅上面的修改。 – themenace92

+0

你期待什么输出? – Kane

您需要使用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的集合中的当前数据集。

+0

它的工作原理!非常感谢:D – themenace92

+0

我的快乐!乐于帮助! –

+0

我可以问一下,外部是否包含NULL也是交叉和外部的区别? – themenace92