2012-06-28 5 views
7

В настоящее время у меня есть этот код, который хранит XML в столбце типа XML, называемом data, в таблице под названием Storage.Измельчение 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>'); 

Я хотел бы создать представление под названием Football View, который клочья данные и отображает его в виде: FootballView (TeamName, менеджер, Ground).

Я до сих пор измельчал полные документы, используя метод .nodes(), в столбцы таблицы, но при создании представления кажется более сложным (у меня есть причины для использования представлений). Проблема в том, что ранее я только что называл .nodes для переменной @input, которая была DECLARE'd как xml = 'xmlcontent', но с представлениями это невозможно, и я хочу проанализировать XML, содержащийся в столбце Столбец таблицы.

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

EDIT:

Раньше, если я измельченные в таблицах это будет код я использую:

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

ответ

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

+0

Он работает! Большое спасибо: D – themenace92

+0

Мое удовольствие! Рад был помочь! –

+0

Могу ли я спросить, существует ли разница между крестом и внешним, что внешний будет включать в себя также NULL? – themenace92

Смежные вопросы