SQLServer : FOR XML PATHについてあまり考えてこなかったかも
いままであまり深く考えていなかったけれども、SQLServerのFOR XML PATH句について、「タグは存在するけど、数値(文字列)がない」もしくは「タグ自体が存在しない」の2パターンについて考えてみた。
正直、いままでこれらの違いについて考えてたことなかった。しかしある時、いつも使用していたNULL判定について、挙動がおかしいことに気づいた。なので、それぞれについて以下のクエリで試してみた。
-- テスト用XMLを定義。ARG1, ARG2タグには値を挿入し、ARG3は値無し、ARG4はタグ自体無しとした。
'<ROOT>
<ARG1>1</ARG1>
<ARG2>2</ARG2>
<ARG3></ARG3>
</ROOT>'
DECLARE @xml_predoc INT
EXEC sp_xml_preparedocument @xml_predoc OUTPUT, @xml
-- ARG1, 2, 3, 4について同条件でSELECTする。
SELECT
ARG1 ,ARG2 ,ARG3, ARG4
FROM OPENXML(@xml_predoc, '/ROOT', 2)
WITH( ARG1 INT, ARG2 INT, ARG3 INT, ARG4 INT)
FOR XML PATH('ROOT')
このクエリを実行すると、結果は以下となる。
<ROOT>
<ARG1>1</ARG1>
<ARG2>2</ARG2>
<ARG3>0</ARG3>
</ROOT>
つまり、
1, タグはあるけど値を記載していない = 整数型なら0 。文字列型なら空文字。
2, タグ自体ないものに対してSELECTする = NULL
本当にあまり考えてこなかったけれども、パターン1については0になると考えると、条件文など適当に書くとエラーが出そう。
もしかしたら基礎なのかもしれないけれども、備忘録として。