Vous ne pouvez pas mélanger les types de données dans les expressions CASE (ou du moins sans prendre soin qu'ils transtyperont implicitement OK)
lorsqu'il est confronté à une déclaration comme la suivante, SQL Server utilisera la priorité des types de données pour déterminer quel devrait être le type de données global de l'expression
SELECT CASE WHEN 1=1 THEN 'not-a-date' ELSE getdate() END
Pour le datetime
ci-dessus a une priorité supérieure à char
il convertit donc implicitement la chaîne en une date qui échoue.
Ce qui suit réussit cependant en tant que sql_variant
a une priorité plus élevée
SELECT CASE WHEN 1=1 THEN cast('not-a-date' as sql_variant) ELSE getdate() END
Ainsi, vous pouvez renvoyer plusieurs types de données mixtes de cette façon (je ne sais pas à quel point sql_variant
est facile est de travailler avec cependant)
Autre que cela, vous pouvez retourner NULL
pour les dates/heures invalides au lieu de renvoyer les données absurdes ou de tout convertir en une chaîne si vous devez la renvoyer.