🙌
SQL Server の ISNULL での型に関する注意
SQL Server の ISNULL(第1引数, 第2引数) は、
- 第1引数がNULLではない時、第1引数を返し、型は第1引数の型である。
- 第2引数がNULLの時、第2引数を返し、型は第2引数の型である。
そのため、第1引数と第2引数で型が異なると返り値の型が一意に決まらない。
次のクエリでは KINGAKU (型 money) と 0 (型 int) が ISNULL の引数となっているが、KINGAKU が NULL かどうかによって型が変わる。
SELECT ISNULL(KINGAKU, 0)
そのため、SELECTの返り値の型を外部で利用する場合やSELECTから一時テーブルを作る場合に想定している money ではない型が設定される。
次のクエリは TABLE2 のINSERT時にエラーとなる。
SELECT
ISNULL(KINGAKU1, 0) AS KINGAKU
INTO #NEWTABLE
FROM
TABLE1
INSERT #NEWTABLE
SELECT
ISNULL(KINGAKU2, 0) AS KINGAKU
FROM
TABLE2
対策
-
$0を用いるようにする。 -
CASTで型を指定する。 -
INTOを使用せず、一時テーブルを定義する。
SELECT ISNULL(KINGAKU, $0)
SELECT
ISNULL(KINGAKU1, $0) AS KINGAKU
INTO #NEWTABLE
FROM
TABLE1
INSERT #NEWTABLE
SELECT
ISNULL(KINGAKU2, $0) AS KINGAKU
FROM
TABLE2
Discussion