2009-07-31 19 views
9

XMLフィールドを持つテーブルがあります。 これに含まれる典型的なXMLは次のとおりです。私は約50行を持って私のテーブルでSQL Server XMLデータ型の操作

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

、私は2つのフィールドのみ、OMID(int型主キー)とomText(私のXMLデータ)と心配です。私が達成しようとしている何

は、全体のテーブル内のすべてのXMLデータを越え、というのが道です...私のタイトルはXである。xmlElementsのすべてを与えるか、または私のカウントを与えますimageIdを55とするすべてのアイテム。

私は、XMLデータ型のVALUEおよびQUERY関数を使用してデータを取得しています。

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 

私が探しているIDがドキュメントの最初のIDである場合にのみ動作します。それはXMLのすべてを検索するようではありません。

基本的には、結果セットはTABLEの各エントリごとに1つの行が戻ってきます。これは、一致する要素ごとに1つの行を持つ必要があると思います...このthoのグループバイナリの書き方を開始する方法は正確にはわかりません。

私はこれをもっと難しくしているように感じ始めています......思考&アイデアをお願いします。私が達成しようとしている何

答えて

16

全体テーブル内のすべての のXMLデータを越え、というのが方法です...私のタイトルはX.

あるxmlElements のすべてを与えます

ここであなたの質問を完全に理解しているかどうかはわかりません。あなたが「ノード」のすべて/もの/フルーツ要素をつかむだろうし、クロスMYTABLEであなたの「基本データ」に対して、それらを結合 - 結果はあなたのXMLデータフィールドにXML要素ごとに1つの行を次のようになります。

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' 

それとも私に55

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

のIMAGEIDを使用するすべてのアイテムの数を与えるには、あなたが探しているものということですか?

マーク

+1

これは.....あなたはスターです。乾杯:) あなたはSQL XML操作上で読んでいくためにまともなリソースの方向に私を指すことができますか? – GordonB

+2

私は助けてくれるとうれしい、ゴードン!私が今までに見つけた最良のXML XML DMLの記事はかなり古いですが、それでも非常に便利です:http://www.15seconds.com/Issue/050803.htm –

+0

これは多分ここにあります:http://www.sqlservercentral.com/記事/ SQL + Server + 2005/XML / –

関連する問題