今度は、XQueryの例を解説していきます。
まずは、XMLデータの設定です。
declare @xmldata xml;
set @xmldata = N'
<group>
<name>わんくま同盟</name>
<member>
<name>中博俊</name>
<name>じゃんぬねっと</name>
<name>夏椰</name>
<name>なおこ(・∀・)</name>
<name>まゆりん</name>
<name>はなおか じった</name>
</member>
</group>' ;
ここから以下の操作をしていきます。
- グループ名称の要素を取得する。
select @xmldata.query('/group/name');
/group/nameの要素を取得している。
実行結果
- グループ/名称の値を取得する。
select @xmldata.value('(/group/name)[1]', 'varchar(max)');
/group/nameの1番目の値をvarcharに変換して返す。
実行結果
- メンバ名の要素を取得する。
select @xmldata.query('for $i in /group/member/name return $i');
/group/member/name毎に$iへ代入して、それを返している。
実行結果
<name>中博俊</name>
<name>じゃんぬねっと</name>
<name>夏椰</name>
<name>なおこ(・∀・)</name>
<name>まゆりん</name>
<name>はなおか じった</name>
- メンバ名の値を取得する。
select @xmldata.query('for $i in /group/member/name return data($i)');
/group/member/name毎に$iへ代入して、データ部分を返している。
実行結果
中博俊 じゃんぬねっと 夏椰 なおこ(・∀・) まゆりん はなおか じった
- メンバ名の要素を取得する。ただし、要素ごとに行セットにして返す。
select d.query('.') from @xmldata.nodes('/group/member/name') T(d);
/group/member/name毎に行セットを作成し、それのテーブル名 = T、列名 = dとして定義する。
dに対するクエリにて要素を取得している。
実行結果
| <name>中博俊</name> |
| <name>じゃんぬねっと</name> |
| <name>夏椰</name> |
| <name>なおこ(・∀・)</name> |
| <name>まゆりん</name> |
| <name>はなおか じった</name> |
- 「わんくま同盟」というグループ名称を「ぴんくま同盟」に修正する。
set @xmldata.modify('replace value of (/group/name/text())[1] with "ぴんくま同盟"')
select @xmldata.query('/group/name');
modifyにてクエリ修正を宣言し、replace value ofにて値の変更を宣言している。
実行結果
- 「ぴんくま同盟」ではないメンバを削除する。
set @xmldata.modify('delete /group/member/name[1]');
set @xmldata.modify('delete /group/member/name[1]');
set @xmldata.modify('delete /group/member/name[4]');
select d.query('.') from @xmldata.nodes('/group/member/name') T(d);
modifyにてクエリ修正を宣言し、deleteにて値の削除を宣言している。
実行結果
| <name>夏椰</name> |
| <name>なおこ(・∀・)</name> |
| <name>まゆりん</name> |
- 「ぴんくま同盟」のメンバに「片桐 継」さんを追加する。
set @xmldata.modify('insert <name>片桐 継</name> as first into (/group/member)[1]');
select d.query('.') from @xmldata.nodes('/group/member/name') T(d);
modifyにてクエリ修正を宣言し、insertにて値の追加を宣言している。
また、as first intoにてどこに追加するかを宣言している。
この場合、、(/group/member)[1] = メンバーの最初の要素の最初に追加される。
実行結果
| <name>片桐 継</name> |
| <name>夏椰</name> |
| <name>なおこ(・∀・)</name> |
| <name>まゆりん</name> |
ざっくり説明ですが、こんな感じっす♪
XQueryはそんなに難しくないかと思います。
ただ、XPathをどのように指定して、どんなクエリを組むかという部分が肝になるのかなぁと思います。