Como posso usar coalesce para verificar se todas as variáveis com precedência de tipo diferente são NULL sem encontrar erros.
DECLARE
@StartDate DATETIME = NULL,
@EndDate DATETIME = NULL,
@StateCode CHAR(2) = NULL,
@CountyCode CHAR(3) = NULL,
@ProducerName VARCHAR(64) = null,
@TaxID VARCHAR(9) = null,
@Farm INT = null
SELECT CASE WHEN COALESCE(
@StartDate,
@EndDate,
@StateCode,
@CountyCode,
@ProducerName,
@TaxID,
@Farm) IS NULL
THEN 'yes' ELSE 'no' END
Saída: 'sim'
adicionando SELECT @StateCode = '22'
dá esse erro
Msg 241, Level 16, State 1, Line 94
Conversion failed when converting date and/or time from character string.
isso é válido
SELECT CASE WHEN
COALESCE(@StartDate, @EndDate) IS NULL
AND COALESCE(@StateCode, @CountyCode, @ProducerName, @TaxID) IS NULL
AND @farm IS NULL
THEN 'yes' ELSE 'no' END
Eu adoraria saber se há outra maneira inteligente de fazer isso de maneira concisa, para não ter que me lembrar de separar por família de tipos.
Contanto que todas as variáveis envolvidas sejam de tipos de dados compatíveis
sql_variant
(neste caso, basicamente não há tipos de dados LOB, tipos CLR ou tipos de dados definidos pelo usuário), você pode usarSó é necessário lançar um dos argumentos como
COALESCE
E
sql_variant
tem uma precedência de tipo de dados muito alta (superada apenas por tipos de dados definidos pelo usuário e eles impediriam que o método funcionasse de qualquer maneira).Pessoalmente, não acho isso mais compreensível do que apenas encontrar a conjunção dos
IS NULL
resultados individuais.Acho a sintaxe simples mais legível e menos confusa. Por que usar funções (que podem lançar esses erros estranhos) quando você pode verificar se todas as variáveis (uma por uma) são
NULL
?:Condições alternativas - embora menos legíveis na minha opinião seriam:
e
Essas duas últimas opções são semelhantes a outra opção (SQL padrão, mas ainda não implementada no SQL Server):
COALESCE deve retornar um tipo de dados válido.
Acho que seu problema está relacionado à forma como funciona para determinar o tipo de dados a ser retornado.
Uma solução rápida pode ser: