前回のおさらい
SQL Serverを使用して、XQuery用のXMLを取得することに成功。しかし「不正なXML」状態で取得されてしまう問題が。ルートを新たに加えるオプションを発見することで、「不正なXML」からの脱却を図ったのだが……。
■TAX(消費税マスタ)テーブル
TAXCODE |
TAXNAME |
TAXRATE |
MODIFIED |
0 |
非課税 |
0 |
2000/01/01 0:00:00 |
1 |
課税 |
5 |
2001/01/01 0:00:00 |
8 |
旧消費税 |
3 |
2008/01/01 0:00:00 |
9 |
その他 |
NULL |
2009/01/01 0:00:00 |
■SQL文
1 2 3 4 5
|
SELECT * FROM TAX FOR XML PATH, ROOT
|
■XML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
<root> <row> <TAXCODE>0</TAXCODE> <TAXNAME>非課税</TAXNAME> <TAXRATE>0</TAXRATE> <MODIFIED>2000-01-01T00:00:00</MODIFIED> </row> <row> <TAXCODE>1</TAXCODE> <TAXNAME>課税</TAXNAME> <TAXRATE>5</TAXRATE> <MODIFIED>2001-01-01T00:00:00</MODIFIED> </row> <row> <TAXCODE>8</TAXCODE> <TAXNAME>旧消費税</TAXNAME> <TAXRATE>3</TAXRATE> <MODIFIED>2008-01-01T00:00:00</MODIFIED> </row> <row> <TAXCODE>9</TAXCODE> <TAXNAME>その他</TAXNAME> <MODIFIED>2009-01-01T00:00:00</MODIFIED> </row> </root>
|
NULLの項目が出てこない
消費税が「その他」の場合、「TAXRATE」は「NULL」です。これがXMLには出力されていません。
それなら「NULL」を、別の何かに置き換えてしまえばよいですね。「ISNULL」関数の出番です。
実際にやってみました。「*」で省略していたフィールド名を、ひとつひとつ書かなければなりませんが、4つしかないので、パパッとやってしまいます。
1 2 3 4 5 6 7 8
|
SELECT TAXCODE, TAXNAME, ISNULL( TAXRATE, '' ), MODIFIED FROM TAX FOR XML PATH, ROOT
|
実行。F5!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
<root> <row> <TAXCODE>0</TAXCODE> <TAXNAME>非課税</TAXNAME> 0 <MODIFIED>2000-01-01T00:00:00</MODIFIED> </row> <row> <TAXCODE>1</TAXCODE> <TAXNAME>課税</TAXNAME> 5 <MODIFIED>2001-01-01T00:00:00</MODIFIED> </row> <row> <TAXCODE>8</TAXCODE> <TAXNAME>旧消費税</TAXNAME> 3 <MODIFIED>2008-01-01T00:00:00</MODIFIED> </row> <row> <TAXCODE>9</TAXCODE> <TAXNAME>その他</TAXNAME> 0 <MODIFIED>2009-01-01T00:00:00</MODIFIED> </row> </root>
|
なんと! むき出しの値が取得されました(※見やすいように改行を加えています)。
納得がいかないので色々あがいていたら、意外と単純な方法で「TAXRATEタグ」を出すことに成功しました。
TAXRATEタグを出す
その答えは、フィールドに別名をつけることでした。どうやら「AS」を使用して名前を定義し直せばイケるようです。
1 2 3 4 5 6 7 8
|
SELECT TAXCODE, TAXNAME, ISNULL( TAXRATE, '' ) AS TAXRATE, MODIFIED FROM TAX FOR XML PATH, ROOT
|
トン。F5!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
<root> <row> <TAXCODE>0</TAXCODE> <TAXNAME>非課税</TAXNAME> <TAXRATE>0</TAXRATE> <MODIFIED>2000-01-01T00:00:00</MODIFIED> </row> <row> <TAXCODE>1</TAXCODE> <TAXNAME>課税</TAXNAME> <TAXRATE>5</TAXRATE> <MODIFIED>2001-01-01T00:00:00</MODIFIED> </row> <row> <TAXCODE>8</TAXCODE> <TAXNAME>旧消費税</TAXNAME> <TAXRATE>3</TAXRATE> <MODIFIED>2008-01-01T00:00:00</MODIFIED> </row> <row> <TAXCODE>9</TAXCODE> <TAXNAME>その他</TAXNAME> <TAXRATE>0</TAXRATE> <MODIFIED>2009-01-01T00:00:00</MODIFIED> </row> </root>
|
でき……てません!
よく見てみると、「NULL」が「0」に変換されています。TAXRATEは数値型だからでしょうか。しかしここでは、「NULL」の場合は「空の要素」で取得したいところです。
MSDNのヘルプを片っ端から読みました。するとあったんです。「NULL」を「空の要素」で取得するオプションが。
ELEMENTS XSINIL
空の要素を取得するオプション。それは、「ELEMENTS XSINIL」でした。しかも、「ISNULL」を個別のフィールドに書く必要がなくなるので、SQL文がスッキリしました。
1 2 3 4 5
|
SELECT * FROM TAX FOR XML PATH, ROOT, ELEMENTS XSINIL
|
いきます。F5!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <row> <TAXCODE>0</TAXCODE> <TAXNAME>非課税</TAXNAME> <TAXRATE>0</TAXRATE> <MODIFIED>2000-01-01T00:00:00</MODIFIED> </row> <row> <TAXCODE>1</TAXCODE> <TAXNAME>課税</TAXNAME> <TAXRATE>5</TAXRATE> <MODIFIED>2001-01-01T00:00:00</MODIFIED> </row> <row> <TAXCODE>8</TAXCODE> <TAXNAME>旧消費税</TAXNAME> <TAXRATE>3</TAXRATE> <MODIFIED>2008-01-01T00:00:00</MODIFIED> </row> <row> <TAXCODE>9</TAXCODE> <TAXNAME>その他</TAXNAME> <TAXRATE xsi:nil="true" /> <MODIFIED>2009-01-01T00:00:00</MODIFIED> </row> </root>
|
きたー!
ついに「空の要素」を取得できました。
よく見てみると、「root」に名前空間「xsi」が追加されています。そして、「TAXRATE」は空の要素になり、属性「xsi:nil="true"」が追加されています。この属性により、単なる「空の要素」なのか「NULL」なのかを判断することができます。
ありがとうございました
さて、今回なんとか「テーブル」→「XML」を実現することができました。それだけでも満足なのに、よく調べてみると、なんと! その逆もできるらしいです!
次回は、XMLでテーブルの更新に挑戦してみようと思っています。