2012-06-24 2 views
6

Я искал всюду для получения помощи по этому вопросу.Измельчение данных из XML, импорт в реляционные таблицы (SQL Server 2008)

Я новичок во всем этом, и мне трудно понять всю документацию на нем.

Скажет, у меня есть этот 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> 

Я хочу взять данные из этого и загрузить его в реляционную таблицу с именем footballteams (имя, менеджер, земля).

Я хотел бы сделать это в SQL Server 2008, и из того, что я читал повсюду, полезным методом для этого является метод .nodes(), но я просто не могу понять, как его использовать.

+2

Хороший вопрос, и +1 для размещения Ливерпуля в верхней :-) – EvilDr

ответ

8

Попробуйте что-то вроде этого:

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) 

В принципе, вызов .nodes() создать псевдо «стол» под названием Tbl с одного столбца XML называется Foot, который будет содержать каждый <team> XML узел в качестве значения.

Затем, вы можете выбрать из этого псевдо таблицы и извлечения отдельных значений атрибутов XML (@manager) и элементы (name, ground) из этого <team> XML фрагмент кода, и преобразовать те в значение данных T-SQL определенного типа вашего выбора.

Чтобы вставить эти значения в таблицу - просто использовать INSERT оператор, основанный на этом:

;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

Фантастического ответа Марк (парень шотландец в придачу;)) У меня есть несколько вопросов, если вы не возражаете ... 1) Я нахожусь в положении, когда я буду делать это для нескольких документов, которые должны иметь разные структуры. Я собираюсь написать приложение на Java с помощью JDBC, чтобы разбить эти различные XML-таблицы на таблицы. Как мне это сделать? 2) Есть ли какие-либо преимущества от гибридного измельчения? – themenace92

+0

(1) зависит от того, хотите ли вы просто загрузить эти XML-документы в SQL Server и измельчить их там - или изложить их заранее, на Java и вставить реляционные результаты - что вам будет легче. (2) объяснить * hybrid * shredding - что вы подразумеваете под этим? –

+0

Из того, что я понимаю, это где-то XML хранится в его родной форме, а некоторые из них «измельчены». Спасибо за ваш ответ. Marc – themenace92

0

С простым XML вы можете использовать адаптер XML в SSIS. Он автоматически создает XSD. Программирование не требуется. Если XML более сложный, используйте www.eXtractor.ONE. Очень общий метод, который обрабатывает все типы XML.

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