Mr.Tです、こんにちは。
私自身、XMLってのはほとんど利用したことがない人で、使い道もよくわかっていないのですが、
TreeViewコントロールを使おうと決定してから、XMLでうんうん悩んでプログラムしています。
#System.Web.UI.WebControls.TreeViewクラスの方です。
TreeViewにはXMLDataSourceを利用して、データをバインドすることにしたので、
XMLDataSource.data = XMLデータ
TreeView.DataSourceID = XMLDataSource.ID
みたいな感じにしてやればあっさりバインドしてくれます。
さて、簡単にSQLServerでテーブルから、XMLとしてデータを取り出そうという場合、
select hoge1,hoge2,hoge3 from Table for XML AUTO
と書けば、すぐにXMLデータが取り出せます。
詳細にしたい場合は、Auto以外の指定もできるので、下のところを参考にしてみればよいと思います。
RAW モードの使用
AUTO モードの使用
EXPLICIT モードの使用
私がやっていたことは、
<工場からこうば>
<工場 CD="1" Name="本社工場">
<こうば CD="111" Name=”Aこうば”>
<製品 CD="111000" Name="製品A"/>
</こうば>
</工場>
</工場からこうば>
こんな感じのデータをイメージしてました。全てのノードで、属性が、CDとNameの二つがあります。
なので、これをとりだそうとして、Selectをかけようと思い、
select 工場.工場コード as [CD],工場.工場名 as [Name]
,こうば.こうばコード as [CD],こうば.こうば名 as [Name]
,製品.製品コード as [CD],製品.製品名 as [Name]
from T_工場 工場
inner join T_工場リレーション
....
inner join T_こうば こうば
.....
inner join T_こうばリレーション
.....
#工場リレーションなどのテーブルは、工場とこうばの結びつきのデータが入ってます。
ところが、これをXML AUTOで出そうとすると怒られる。
列名 'CD' が繰り返されています。同じ XML タグに同じ属性を複数回生成することはできません。
メッセージから、すると、一つのノードに対して、CDを複数指定しているということだから、きちんとノードとして
それぞれのデータが認識されていないということになる。
ううん?なぜ、と思い、色々調べてみたのだけど、どうもいまいちわからない。
上記リンク先のAUTOモードの使用では、このように説明されている。
FROM 句の各テーブルは XML 要素として表され、そのうち少なくとも 1 列が SELECT 句のリストに含められます。FOR XML 句で省略可能な ELEMENTS オプションを指定すると、SELECT 句のリストに含められる列は属性またはサブ要素にマップされます。
生成される XML 内の要素が入れ子になった XML 階層は、SELECT 句で指定されている列で識別されるテーブルの順序に基づきます。そのため、SELECT 句で列名を指定する順序は重要です。先頭、つまり識別された左端のテーブルにより、生成される XML ドキュメント内の最上位要素が形成されます。SELECT ステートメント内の列で識別された左から 2 番目のテーブルにより、最上位要素内のサブ要素が形成されます。以降についても同様です。
テーブルが要素となり、指定している順番にサブ要素となる(つまり子になる)。同じテーブルから参照されるデータは、要素の属性となる
ということが書いてあります。
なのに、これじゃあ、指定ができない。
で、試行錯誤(Try&Error)してみたところ、こういうのはできるようです。
with 工場 as (
select ~ from T_工場
inner join T_工場リレーション
on ....
)
,with こうば as (
select ~ from T_こうば
inner join T_こうば
on ....
)
select 工場.工場コード as [CD],工場.工場名 as [Name]
,こうば.こうばコード as [CD],こうば.こうば名 as [Name]
,製品.製品コード as [CD],製品.製品名 as [Name]
from 工場
inner join こうば
on 工場.こうばコード= こうば.こうばコード
....
CTE(共通テーブル式)を利用して、こういう形にするとできるんです。やっていることは一緒なんですけどね。
CTEを使った場合は、T_~リレーションというテーブルは最終XMLとして利用するSQL内には出てきませんので、
それが原因なのかなと思ってみたりもしたのですが、意味がよくわかりません。
今でも納得はできていないのです。