Transact-SQLのISNULL内では型比較が必ず発動するらしい
仕事の備忘録。
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が入ってきても同じくエラーになるので、どちらにしても型をきちんと合わせるのが正解なんですが、たまたまこのエラー原因に行き着くのが難しいケースにぶち当たったのでメモ。初歩的なことで理解してないことが結構あります。