Você não pode misturar tipos de dados em expressões CASE (ou pelo menos sem tomar cuidado para que eles sejam convertidos implicitamente em OK)
quando confrontado com uma instrução como a seguinte, o SQL Server usará a precedência de tipo de dados para determinar qual deve ser o tipo de dados geral da expressão
SELECT CASE WHEN 1=1 THEN 'not-a-date' ELSE getdate() END
Para o
datetime
acima tem precedência maior que char
então ele converte implicitamente a string para uma data que falha. O seguinte é bem-sucedido, no entanto, como
sql_variant
tem uma precedência mais alta
SELECT CASE WHEN 1=1 THEN cast('not-a-date' as sql_variant) ELSE getdate() END
Assim, você pode retornar vários tipos de dados mistos dessa maneira (não tenho certeza de quão fácil
sql_variant
é para trabalhar embora) Fora isso, você pode retornar
NULL
para datas inválidas em vez de retornar os dados sem sentido ou converter tudo em uma string se você precisar devolvê-lo.