DocDate
という名前のdatetime2
列があり、ISNULL
チェックを評価して、NULL
ではなく空の''
値を返します。
ステートメントのスニペット:
SELECT TOP 100
DocumentId
,DocDate
,ISNULL(DocDate,'') AS 'DocDateEmpty'
FROM
DocDetails
WHERE
DocDate IS NULL
これは以下を返します:1900-01-01 00:00:00.0000000
私のWHERE
句は、明示的にNULL
である行のみを明確に返すため、DocDate
が空の文字列であり、0
に評価されるという問題はありません。
どのようにDocDate IS NULL
を正しく評価できますが、ISNULL
は失敗しますか?
[〜#〜] msdn [〜#〜] ごとに、ISNULL
はliteralNULL
の値を正しく評価し、空を返す必要があります値。
check_expressionと同じ型を返します。 check_expressionとしてリテラルNULLが指定されている場合、replacement_valueのデータ型を返します。 check_expressionとしてリテラルNULLが提供され、replacement_valueが提供されない場合、intを返します。
これは、DATETIME
および_DATETIME2
_で発生します。
_DECLARE @dummy DATETIME2 = NULL
SELECT @dummy, ISNULL(@dummy, N'')
GO
DECLARE @dummy DATETIME = NULL
SELECT @dummy, ISNULL(@dummy, N'')
GO
_
DATE
およびTIME
とともに
_DECLARE @dummy DATE = NULL
SELECT @dummy, ISNULL(@dummy, N'')
GO
DECLARE @dummy TIME = NULL
SELECT @dummy, ISNULL(@dummy, N'')
GO
_
私はそれを回避する最も簡単な方法は、2番目のCONVERT
を文字列に追加することだと思います:
_DECLARE @dummy DATETIME2 = NULL
SELECT @dummy, ISNULL(CONVERT(NVARCHAR(30), @dummy), N'')
GO
_
必要に応じて空の文字列を返します。
whyに関する質問に答えるために、別のシナリオを見てみましょう。
_DECLARE @dummy INT = NULL
SELECT @dummy, ISNULL(@dummy, '')
_
ここでのISNULL
は0を返します。SQLServerが日付を格納および処理する方法がわからない場合は、詳細について、「my Q&A here 」を参照してください。
つまり、SELECT CONVERT(DATETIME, 0)
を実行すると、おなじみの結果が得られます。空の数値のようなものはなく、空の文字列から数値式への変換もありません。
お役に立てれば!