Измельчение XML из столбца таблицы в представление в SQL Server

В настоящее время у меня есть этот код, который хранит XML в столбце 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() на столбцы таблицы, но при создании представления это кажется более сложным (у меня есть причины для использования представлений). Проблема в том, что ранее я просто вызывал .nodes для переменной @input, которая была DECLARE'd как xml = 'xmlcontent', но с представлениями это невозможно сделать, и я хочу проанализировать XML, содержащийся в столбце таблицы Storage.

Любые идеи? Заранее спасибо.

РЕДАКТИРОВАТЬ:

Раньше, если бы я разделил на таблицы, я бы использовал такой код:

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: это результат, который я ожидаю.

Ожидаемый результат


person Community    schedule 28.06.2012    source источник
comment
Можете ли вы опубликовать код, который вы использовали для измельчения, в столбцы, а также то, как вы пытались его преобразовать.   -  person Jon Egerton    schedule 28.06.2012
comment
Какой результат вы ожидаете?   -  person Kane    schedule 28.06.2012
comment
В чем проблема разместить этот запрос в представлении?   -  person Damien_The_Unbeliever    schedule 28.06.2012
comment
Проблема в том, что ранее я просто вызывал .nodes для переменной @input, которая была DECLARE'd как xml = 'xmlcontent', но с представлениями это невозможно сделать, и я хочу проанализировать XML, содержащийся в столбце таблицы Storage.   -  person    schedule 28.06.2012


Ответы (1)


Вам нужно использовать 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 APPLY и OUTER APPLY позволяют эффективно присоединиться к коллекции XML в текущем наборе данных.

person Code Magician    schedule 28.06.2012
comment
Могу я спросить, есть ли разница между cross и external apply в том, что external также будет включать NULL? - person ; 28.06.2012
comment
@user1320771 — Использование APPLY страница в обеих формах, включая различия. - person Damien_The_Unbeliever; 28.06.2012