2009-07-31 31 views
9

XML alan içeren bir tablom var. İçerdiği tipik XML; i yaklaşık 50 satır var benim tablodaSQL Server XML veri türü ile çalışma

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

i iki alan, Omid (int birincil anahtar) ve omText (benim xml verileri) ile sadece endişeleniyorum.

bütün tablodaki tüm xml verileri arasında, demenin bir yolu ... başlık X. nerede bana xmlElements tüm vermek Veya bana sayımını vermeye ne i elde etmek çalışıyorum olduğunu 55.

imageId kullanan tüm öğeler Verileri almak için XML veri türü VALUE ve QUERY işlevlerini kullanıyorum.

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 

Yalnızca, aradığım kimliğin, belgede ilk sırada bulunduğu yerde çalışır. Xml'nin tümünü aramıyor gibi görünüyor.

Temel olarak sonuçlar, TABLOdaki her giriş için bir satır ile birlikte gelir, her bir eşleşme için bir satırın olması gerektiğini düşünürüm ... Bu grup için bir grup yazmanın nasıl başlayacağından tam olarak emin değilim.

Olması gerekenden daha zor oluyorum gibi hissetmeye başladım ...... düşünceler & fikirler lütfen.

cevap

16

Ne i elde etmek çalışıyorum başlık X.

nerede bana xmlElements tüm vermek ... Bütün tablodaki tüm xml verileri arasında, demenin bir yoludur

Sorunuzu tamamen anlayabildiğimden emin değilim - ya da bunun için mi arıyorsunuz? Bir "düğüm" Tüm/şeyler/Meyve elemanları kapmak istiyorum ve çapraz myTable da "taban verileri" karşı onlara katılmak - sonuç XML veri alanında XML öğesi başına bir satır olacaktır:

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' 

Ya bana 55.

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

bir ImageID kullanan tüm öğelerin sayısını vermek aradığınız şey bu mu?

Marc

+1

O Bir yıldızsın ..... olduğunu. Alkışlar :) SQL XML manipülasyonunu okumak için herhangi bir iyi kaynak yönünde bana işaret edebilirsin sanmıyorum ??? – GordonB

+2

Yardım edebilirim, Gordon! Şimdiye kadar bulduğum en iyi SQL XML DML makalesi oldukça eski, ama yine de çok yararlı: http://www.15seconds.com/Issue/050803.htm –

+0

Veya buradaki belki: http://www.sqlservercentral.com/ Makaleler/SQL + Sunucu + 2005/XML / –

İlgili konular