2012-06-24 69 views
6

Tôi đã xem xét mọi nơi để được trợ giúp về vấn đề này.Chia nhỏ dữ liệu từ XML, Nhập vào bảng quan hệ (SQL Server 2008)

Tôi là người mới đối với tất cả điều này và tôi thấy khó hiểu tất cả tài liệu trên đó.

Nói rằng tôi có XML này:

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

Tôi muốn lấy dữ liệu từ này và tải nó vào một bảng quan hệ được gọi là footballteams (tên, người quản lý, mặt đất).

Tôi muốn thực hiện điều này trong SQL Server 2008 và từ những gì tôi đã đọc ở khắp mọi nơi, phương pháp hữu ích để thực hiện điều này là phương thức .nodes(), nhưng tôi không thể hiểu cách sử dụng nó.

+2

Câu hỏi hay và +1 để đặt Liverpool ở trên cùng :-) – EvilDr

Trả lời

8

Hãy thử một cái gì đó như thế này:

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) 

Về cơ bản, cuộc gọi đến .nodes() tạo ra một giả "bảng" gọi Tbl với một cột XML duy nhất gọi là Foot sẽ chứa mỗi nút <team> XML như giá trị của nó.

Sau đó, bạn có thể chọn từ đó bảng giả và trích xuất các giá trị cá nhân của các thuộc tính XML (@manager) và các yếu tố (name, ground) từ đó đoạn <team> XML, và chuyển đổi những đến một giá trị dữ liệu T-SQL của một loại chosing của bạn.

Để chèn những giá trị vào bảng của bạn - chỉ cần sử dụng một tuyên bố INSERT dựa trên này:

;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

Câu trả lời tuyệt vời Marc (một người bạn Scot vào món hời;)) Tôi có một số câu hỏi nếu bạn không phiền ... 1) Tôi đang ở vị trí mà tôi sẽ làm điều này cho nhiều tài liệu có cấu trúc khác nhau. Tôi đang viết một ứng dụng trong Java bằng cách sử dụng JDBC để băm nhỏ các XML khác nhau này thành các bảng. Làm thế nào tôi nên đi về điều này? 2) Có lợi thế nào để đạt được từ việc băm nhỏ Hybrid? – themenace92

+0

(1) phụ thuộc vào việc bạn chỉ muốn tải các tài liệu XML này vào SQL Server và cắt chúng ở đó - hoặc cắt chúng trước, trong Java, và chèn các kết quả quan hệ - bất cứ điều gì dễ dàng hơn cho bạn. (2) giải thích * lai * băm nhỏ - ý bạn là gì? –

+0

Từ những gì tôi hiểu nó là nơi một số XML được lưu trữ ở dạng bản địa của nó, trong khi một số được 'băm nhỏ'. Cảm ơn bạn đã trả lời của bạn một lần nữa Marc – themenace92

0

Với XML đơn giản bạn có thể sử dụng các bộ chuyển đổi XML trong SSIS. Nó tự động tạo một XSD. Không cần lập trình. Nếu XML phức tạp hơn, hãy sử dụng www.eXtractor.ONE. Một phương pháp rất chung chung xử lý mọi loại XML.

Các vấn đề liên quan