2009-07-31 43 views
9

Tôi có một bảng có trường XML. XML điển hình mà nó chứa;Làm việc với kiểu dữ liệu XML của SQL Server

<things> 
    <Fruit> 
    <imageId>39</imageId> 
    <title>Apple</title> 
    </Fruit> 
    <Fruit> 
    <imageId>55</imageId> 
    <title>Pear</title> 
    </Fruit> 
    <Fruit> 
    <imageId>76</imageId> 
    <title>Grape</title> 
    </Fruit> 
</things> 

Trong bảng tôi có khoảng 50 hàng, tôi chỉ quan tâm đến hai trường, omId (int primary key) và omText (dữ liệu xml của tôi).

gì tôi đang cố gắng để đạt được một cách khác để nói, trên tất cả các dữ liệu xml trong toàn bộ bảng ... cho tôi tất cả các xmlElements nơi tiêu đề là X. Hoặc cho tôi một tội danh là tất cả các mục sử dụng imageId trong số 55.

Tôi đang sử dụng loại dữ liệu XML VALUE và hàm QUERY để truy xuất dữ liệu.

select omID, 
    omText.query('/things/Fruit') 
    ,cast('<results>' + cast(omText.query('/things/Fruit') as varchar(max)) + '</results>' as xml) as Value 
    from dbo.myTable 
    where omText.value('(/things/Fruit/imageId)[1]', 'int') = 76 

Chỉ hoạt động khi id tôi đang tìm kiếm là tài liệu đầu tiên trong tài liệu. Dường như không tìm kiếm tất cả xml.

Về cơ bản, resultset quay trở lại với một hàng cho mỗi mục nhập trong BẢNG, tôi nghĩ tôi cần có một hàng cho mỗi ELEMENT được kết hợp ... Không chắc chắn cách bắt đầu viết nhóm theo thời gian này.

Tôi bắt đầu cảm thấy như tôi đang làm điều này khó hơn nó cần phải ...... suy nghĩ & ý tưởng xin vui lòng.

Trả lời

16

gì tôi đang cố gắng để đạt được là một cách khác để nói, trên tất cả các dữ liệu xml trong toàn bộ bảng ... cho tôi tất cả các xmlElements nơi tiêu đề là X.

Bạn không chắc chắn liệu tôi có hoàn toàn hiểu câu hỏi của bạn ở đây hay bạn đang tìm kiếm câu hỏi này? Bạn sẽ lấy tất cả các/những/yếu tố trái cây một "nút" và chéo tham gia cùng họ chống lại "dữ liệu cơ sở" của bạn trong myTable - kết quả sẽ là một hàng cho mỗi phần tử XML trong lĩnh vực dữ liệu XML của bạn:

select 
    omID, 
    T.Fruit.query('.') 
from 
    dbo.myTable 
cross apply 
    omText.nodes('/things/Fruit') as T(Fruit) 
where 
    T.Fruit.value('(title)[1]', 'varchar(50)') = 'X' 

Hoặc cho tôi một số của tất cả các mặt hàng sử dụng một ImageID của 55.

select 
    count(*) 
from 
    dbo.myTable 
cross apply 
    omText.nodes('/things/Fruit') as T(Fruit) 
where 
    T.Fruit.value('(imageId)[1]', 'int') = 55 

là những gì bạn đang tìm kiếm?

Marc

+1

Đó là ..... Bạn là ngôi sao. Chúc mừng :) Đừng cho rằng bạn có thể chỉ cho tôi theo hướng của bất kỳ tài nguyên phong nha nào để đọc về thao tác SQL XML ??? – GordonB

+2

Vui vì tôi có thể giúp, Gordon! Bài viết XML XML DML tốt nhất mà tôi đã tìm thấy cho đến nay là khá cũ, nhưng vẫn rất hữu ích: http://www.15seconds.com/Issue/050803.htm –

+0

Hoặc tại đây có thể: http://www.sqlservercentral.com/ Các bài viết/SQL + Server + 2005/XML / –

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