2012-06-28 34 views
7

Tôi hiện có mã này lưu trữ XML vào một cột kiểu XML được gọi là dữ liệu, trong một bảng được gọi là Bộ nhớ.Chia nhỏ XML từ cột bảng thành dạng xem trong 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>'); 

Tôi muốn tạo chế độ xem có tên là Chế độ xem bóng đá, cắt dữ liệu và hiển thị dưới dạng: FootballView (TeamName, Manager, Ground).

Tôi đã băm nhỏ toàn bộ tài liệu bằng cách sử dụng phương thức .nodes() thành các cột trong bảng trước, nhưng có vẻ khó khăn hơn khi tạo chế độ xem (tôi có lý do sử dụng chế độ xem). Vấn đề là trước đây tôi chỉ được gọi là .nodes trên một @input biến được DECLARE'd như xml = 'xmlcontent' nhưng với quan điểm này không thể được thực hiện, và tôi muốn phân tích cú pháp XML có trong cột bảng lưu trữ.

Bất kỳ ý tưởng nào? Cảm ơn trước.

EDIT:

Trước đây, nếu tôi đã băm nhỏ vào bảng này sẽ là đoạn code tôi sử dụng:

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: Đây là sản phẩm tôi mong đợi.

Expected Output

+0

Bạn có thể đăng mã bạn đã sử dụng để băm nhỏ thành các cột hay không và cách bạn đã cố gắng chuyển đổi mã đó. –

+1

Xem chỉnh sửa ở trên. – themenace92

+0

Bạn mong đợi sản lượng nào? – Kane

Trả lời

11

Bạn cần phải sử dụng 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 APPLYOUTER APPLY cho phép bạn một cách hiệu quả tham gia vào một bộ sưu tập của XML trong tập dữ liệu hiện hành.

+0

Nó hoạt động! Cảm ơn bạn rất nhiều: D – themenace92

+0

Niềm vui của tôi! Vui vẻ giúp đỡ! –

+0

Tôi có thể hỏi, là sự khác biệt giữa chéo và bên ngoài áp dụng rằng bên ngoài sẽ bao gồm NULL quá? – themenace92

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