2011-12-11 32 views
7

Tôi có một bảng như thế này:Làm thế nào chọn lĩnh vực XML nút cho tất cả các hàng

YEAR int, 
Fields XML 

cột XML của tôi có cấu trúc này cho tất cả các hàng nhưng với giá trị khác nhau:

enter image description here

Làm thế nào tôi có thể nhận kết quả này:

YEAR   ID   NAME    LASTNAME 
--------------------------------------------------- 
2011   1000   Nima    Agha 
2011   1001   Begha    Begha 
2011   1002   Jigha    Jigha 
2011   1003   Aba    Aba 
2012   1034   AAA    BBB 
... 

thanks

Trả lời

10

Làm thế nào về điều này:

SELECT 
    Year, 
    E.P.value('(ID)[1]', 'INT') AS 'ID', 
    E.P.value('(Name)[1]', 'VARCHAR(50)') AS 'Name', 
    E.P.value('(LastName)[1]', 'VARCHAR(50)') AS 'LastName' 
FROM 
    dbo.YourTable 
CROSS APPLY 
    Fields.nodes('/Employees/Person') AS E(P) 

Bạn đang cơ bản chọn Year từ bảng cơ sở và sau đó giải nén mỗi <Person> nút từ cột Fields thành một "bảng XML inline" gọi E với một cột XML duy nhất gọi là P (bạn có thể chọn bất kỳ tên nào bạn thích cho những người đó) mà bạn lại truy vấn và trích xuất các phần tử riêng lẻ.

+0

Đó là Greate .Cảm ơn – Arian

+0

có cách nào để chọn các trường của tôi không có 'CROSS APPLY' không? Tôi muốn tạo chế độ xem chỉ mục dựa trên lựa chọn này – Arian

+0

@Nima: không. CROSS ÁP DỤNG là cách để đi đến lấy ** tất cả ** các phần tử XML được lưu trữ trong một cột XML. Tôi không biết bất kỳ cách nào khác –

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