2012-06-24 54 views
6

Szukałem wszędzie pomocy w tej sprawie.Niszczenie danych z XML, importowanie do tabel relacyjnych (SQL Server 2008)

Jestem nowy w tym wszystkim i trudno mi zrozumieć całą dokumentację na nim.

Say Mam ten XML:

<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> 

Chcę wziąć dane z tego i załadować je do tabeli relacyjnej zwane footballteams (nazwa, menedżer, gruntu).

Chciałbym to zrobić w SQL Server 2008, az tego, co przeczytałem wszędzie, użyteczną metodą jest metoda .nodes(), ale po prostu nie mogę zrozumieć, jak z niego korzystać.

+2

Dobre pytanie, i +1 za wprowadzenie Liverpool na najwyższym :-) – EvilDr

Odpowiedz

8

Spróbuj czegoś takiego:

DECLARE @input XML = '<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>' 


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) 

Zasadniczo wywołanie .nodes() stworzenia „stół” pseudo nazwie Tbl z jednej kolumnie XML nazywa Foot która będzie zawierać każdy węzeł <team> XML jako jego wartości.

Następnie można wybrać z tej tabeli pseudo i wyodrębnić poszczególne wartości atrybutów XML (@manager) oraz elementy (name, ground) Od tego <team> XML urywek i konwersji tych do wartości danych T-SQL typu twojego wyboru.

Aby wstawić te wartości do tabeli - wystarczy użyć INSERT oświadczenie opiera się na tym:

;WITH ShreddedData AS 
( 
    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) 
) 
INSERT INTO dbo.FootballTeams(Name, Manager, Ground) 
    SELECT TeamName, Manager, Ground 
    FROM ShreddedData 
+0

Fantastyczna odpowiedź Marc (kolega Szkot na dodatek;)) Mam kilka pytań, jeśli nie przeszkadza ... 1) Jestem w sytuacji, w której będę to robił dla wielu dokumentów, które będą miały różne struktury. Zamierzam napisać aplikację w Javie przy użyciu JDBC, aby niszczyć te różne XML-y w tabelach. Jak powinienem to zrobić? 2) Czy można uzyskać jakiekolwiek korzyści z rozdrabniania hybrydowego? – themenace92

+0

(1) zależy od tego, czy chcesz tylko załadować te dokumenty XML do SQL Server i je tam zniszczyć - czy też je wcześniej zhakować, w Javie i wstawić relacyjne wyniki - cokolwiek jest łatwiejsze dla ciebie. (2) wyjaśnij rozdrabnianie * hybrydowe - co przez to rozumiesz? –

+0

Z tego, co rozumiem, wynika, że ​​niektóre dane XML są przechowywane w ich natywnej formie, a niektóre są "niszczone". Jeszcze raz dziękuję za odpowiedź Marc – themenace92

0

z prostymi XML można użyć zasilacza XML w SSIS. Automatycznie tworzy XSD. Nie wymaga programowania. Jeśli XML jest bardziej skomplikowany, użyj www.eXtractor.ONE. Bardzo ogólna metoda, która obsługuje każdy typ XML.