.NETでXMLを活用していきます。

SQL ServerでXQueryするには?(準備編2)

»

前回のおさらい

 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でテーブルの更新に挑戦してみようと思っています。

Comment(0)

コメント

コメントを投稿する