2012-06-28 10 views
7

Attualmente ho questo codice che memorizza XML in una colonna di tipo XML chiamata data, in una tabella denominata Archiviazione.Distruzione di XML dalla colonna della tabella in una vista in 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>'); 

vorrei creare una vista denominata Football Guarda che brandelli i dati e li visualizza in forma: FootballView (TeamName, Dirigente, terra).

Ho ridotto a zero i documenti completi utilizzando il metodo .nodes() nelle colonne della tabella, ma sembra essere più difficile quando si crea una vista (ho i miei motivi per usare le viste). Il problema è che in precedenza ho appena chiamato .nodes su una variabile @input che era DECLARE come xml = 'xmlcontent' ma con le visualizzazioni non è possibile farlo e voglio analizzare l'XML contenuto nella colonna della tabella Storage.

Qualche idea? Grazie in anticipo.

EDIT:

In precedenza, se avessi triturato in tabelle questo sarebbe il codice che uso:

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: Questa è l'uscita mi aspetto.

Expected Output

+0

Puoi pubblicare il codice che hai usato per distruggere le colonne e anche come hai provato a convertirlo. –

+1

Vedere la modifica sopra. – themenace92

+0

Quale output ti aspetti? – Kane

risposta

11

è necessario utilizzare 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 e OUTER APPLY permettono di entrare in modo efficace ad una raccolta di XML nel set di dati corrente.

+0

Funziona! Grazie mille: D – themenace92

+0

Il mio piacere! Felice di aiutare! –

+0

Posso chiederlo, è la differenza tra cross e outer applicare che anche l'esterno includerà i NULL? – themenace92

Problemi correlati