2012-04-26 8 views
2

でのXMLデータ型でXMLを変換します。は、私はこのようになりますタグと呼ばれるテーブルを持つSQL Serverの

------------------------------------------------------------------------- 
    |PostId | Title   | Tags          | 
    ------------------------------------------------------------------------- 
    | 1  | Blog Post 1  | <xml><tags><tag>1</tag/><tag>2</tag></tags>| 
    -------------------------------------------------------------------------- 
    | 2  | Blog Post 2  | <xml><tags><tag>2</tag/><tag>3</tag></tags>| 
    -------------------------------------------------------------------------- 
    | 3  | Blog Post 3  | <xml><tags><tag>3</tag/><tag>4</tag></tags>| 
    -------------------------------------------------------------------------- 

これらの2つのテーブルのデータを結合して、1つのビューを作成したいと考えています。ノード内の番号は、タグテーブルの外部キーとして機能する必要があります。

--------------------------------------------------------------------------- 
    | Title   | Tags              | 
    --------------------------------------------------------------------------- 
    | Blog Post 1 | <xml><tags><tag>Travel</tag/><tag>Gadgets</tag><tags>  | 
    ---------------------------------------------------------------------------- 
    | Blog Post 2 | <xml><tags><tag>Gadgets</tag/><tag>Hobbies</tag></tags> | 
    ---------------------------------------------------------------------------- 
    | Blog Post 3 | <xml><tags><tag>Hobbies</tag/><tag>Movies</tag></tags> | 
    ---------------------------------------------------------------------------- 

このようなビューを作成することはできますか?それ、どうやったら出来るの?

答えて

5

何かがトリックを行う必要があります実行することができます:

/* SQL Follows */ 
select 
postID, title, 
tags, 
(
    select 
     /* 4. Retrieve the tag name */ 
     y.tag.value('.', 'int') tagID, 
     t.tagName 
    from 
     /* 2. Shred the XML into nodes */ 
     p.tags.nodes('/xml/tags/tag') as y(tag) 
     /* 3. Join the tag ID onto the tags table. */ 
     inner join #tags t on t.tagID = y.tag.value('.', 'int') 
    for 
     /* 5. Convert it into XML */ 
     xml path('tag'), type 
)tags2 
/* 1. For each post */ 
from #posts p 

私は一時テーブル#tags#postsでを使用しましたこの例。正確な出力を得るには、XMLを少し微調整する必要があります。

+0

これはほとんど動作します!私が気付いた問題は、得られたXMLスキーマが私が望むように静かではないということだけです。結果は、フォーマット 旅行 ガジェット 私が欲しいだけの親ノードです。 – ashwnacharya

+1

ドキュメントごとに '' text() ''を使ってテキストノードを書くことができます。したがって、 '' t.tagName ''をtext() ''に変更して、 '' tagID'あなたが欲しいもの。 – Ben

0

私はあなたのデータがどのように分かっていないので、私は完全な解決法を提供しません。私はそれがあなたが表示するほどシンプルではないと確信していますが、私は正しい方向にあなたを指すことができると思います。

私は完全な文字列の代わりにIDを探しています(たとえば、11を持つことができ、失敗する可能性があるため1だけ見てはいけません)。selectで置き換えます。tagID = ID

select replace('<xml><tags><tag>1</tag/><tag>2</tag></tags>','<tag>1</tag/>',(select name from tags where tagid=1)) 

結果:もちろん

<xml><tags>Travel<tag>2</tag></tags> 

、あなたはそれがどのようにそれを行うにあなた次第ですよりも、それぞれのタグにこれを実行する必要があります。あなたは、タグテーブルをトイレたり、ほんの数のタグを持っている場合は、このようないくつかの回を交換

+0

これは文字列操作であり、各行に対して処理が必要です。私はデータを取得するためにいくつかのXML変換を探しています。そのような仕組みが必要です。 – ashwnacharya

関連する問題