ブロッコリーを克服するまでプログラミング

プログラミングとか趣味とかを報告します。

SQLServer : FOR XML PATHについてあまり考えてこなかったかも

いままであまり深く考えていなかったけれども、SQLServerのFOR XML PATH句について、「タグは存在するけど、数値(文字列)がない」もしくは「タグ自体が存在しない」の2パターンについて考えてみた。

 

正直、いままでこれらの違いについて考えてたことなかった。しかしある時、いつも使用していたNULL判定について、挙動がおかしいことに気づいた。なので、それぞれについて以下のクエリで試してみた。

 

  -- テスト用XMLを定義。ARG1, ARG2タグには値を挿入し、ARG3は値無し、ARG4はタグ自体無しとした。

  DECLARE @xml XML =

  '<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になると考えると、条件文など適当に書くとエラーが出そう。

 

もしかしたら基礎なのかもしれないけれども、備忘録として。