SELECT の結果 を XML で取得する際に NULL を含む値があったら…

元ネタ
SQL文のFOR XMLについて - Database Expert会議室
最近似た様なの SELECT の結果を XML にして返す - お だ のスペース を書いたばっかりなので、気になって調べてみた。
MSDN FOR XML 句の基本構文
MSDN XSINIL パラメータを使用した NULL 値に対する要素の生成


ELEMENTS XSINIL を付与すると、要素の属性として、xsi:nil="true" としてくれる。

SELECT * FROM [TestTable] FOR XML AUTO

<TestTable Id="1" Name="aaa" />
<TestTable Id="2" Name="bbb" />
<TestTable Id="3" />
<TestTable Id="4" Name="hoge" />

SELECT * FROM [TestTable] FOR XML AUTO, ELEMENTS XSINIL

<TestTable xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Id>1</Id>
  <Name>aaa</Name>
</TestTable>
<TestTable xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Id>2</Id>
  <Name>bbb</Name>
</TestTable>
<TestTable xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Id>3</Id>
  <Name xsi:nil="true" />
</TestTable>
<TestTable xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Id>4</Id>
  <Name>hoge</Name>
</TestTable>

結構出力結果が変わりますね…。ISNULL を使うとこんな感じ。

SELECT ISNULL([Id], 'NULL') as [Id], ISNULL([Name], 'NULL') as [Name] FROM [TestTable] FOR XML AUTO

<TestTable Id="1" Name="aaa" />
<TestTable Id="2" Name="bbb" />
<TestTable Id="3" Name="NULL" />
<TestTable Id="4" Name="hoge" />