Eu tenho uma datetime2
coluna chamada DocDate
que estou tentando avaliar uma ISNULL
verificação para retornar um ''
valor em branco para em vez de NULL
.
Um trecho da declaração:
SELECT TOP 100
DocumentId
,DocDate
,ISNULL(DocDate,'') AS 'DocDateEmpty'
FROM
DocDetails
WHERE
DocDate IS NULL
Isso retorna:1900-01-01 00:00:00.0000000
Minha WHERE
cláusula claramente traz de volta apenas as linhas que são explicitamente NULL
, então não é uma questão de DocDate
ser uma string vazia e avaliar para 0
.
Como pode DocDate IS NULL
avaliar corretamente, mas ISNULL
falha?
Por MSDN , ISNULL
deve avaliar o valor literal NULL
corretamente e retornar um valor vazio.
Retorna o mesmo tipo que check_expression . Se um literal NULL for fornecido como check_expression , retornará o tipo de dados do valor_substituição . Se um literal NULL for fornecido como check_expression e nenhum valor_substituição for fornecido, retornará um int .
Isso acontecerá
DATETIME
também comDATETIME2
:Junto com
DATE
eTIME
Eu acho que a maneira mais fácil de contornar isso é adicionar um segundo
CONVERT
a uma string:Que retorna uma string vazia conforme desejado.
Para responder à sua pergunta sobre o porquê , bem, vamos analisar outro cenário:
O
ISNULL
aqui retorna 0. Se você não sabe como o SQL Server armazena e lida com datas, veja minhas perguntas e respostas aqui para obter mais informações.Em suma, se você executar
SELECT CONVERT(DATETIME, 0)
, obterá um resultado familiar. Não existe um número vazio e não há conversão de uma string vazia em uma expressão numérica.Espero que isto ajude!