🙌
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