Jack of all trades

master of none. 多芸は無芸を地で行く、自作自演何でも屋。

Transact-SQLのISNULL内では型比較が必ず発動するらしい

仕事の備忘録。

ISNULL (Transact-SQL)

check_expression
NULL かどうかを調べる式です。 check_expression は任意のデータ型です。
replacement_value
check_expression が NULL の場合に返される式です。 replacement_value は、暗黙的に check_expresssion の型に変換できる型である必要があります。

MSDNに記載されている通り、判定の結果がNULLだった場合に置き換える値は、判定される値と同じ型、もしくは暗黙的に変換できる型でなければ型変換エラーとなります。

型を比較する処理は実際にNULLが入ってきた場合にのみ発動するかと思いきや、NULLでない値が入っている場合でも発動する模様。

DECLARE @d AS DATE = GETDATE()
SELECT ISNULL(@d, 1)

これを実行すると型変換エラーが発生します。

メッセージ 206、レベル 16、状態 2、行 2
オペランド型の不整合: int は date と互換性がありません

ちなみにDATETIME型の場合はINT型から暗黙の型変換が可能なためエラーにはなりません。

DECLARE @dt AS DATETIME = GETDATE()
SELECT ISNULL(@dt, 1)

まぁNULLでない値で型変換エラーになるということはNULLが入ってきても同じくエラーになるので、どちらにしても型をきちんと合わせるのが正解なんですが、たまたまこのエラー原因に行き着くのが難しいケースにぶち当たったのでメモ。初歩的なことで理解してないことが結構あります。