Nemůžete míchat datové typy ve výrazech CASE (nebo alespoň bez ohledu na to, že budou implicitně předávat OK)
při konfrontaci s výrokem jako je následující SQL Server použije prioritu datového typu k určení, jaký by měl být celkový datový typ výrazu
SELECT CASE WHEN 1=1 THEN 'not-a-date' ELSE getdate() END
Pro výše uvedené datetime
má vyšší prioritu než char
takže implicitně přetypuje řetězec na datum, které selže.
Následující však uspěje jako sql_variant
má vyšší prioritu
SELECT CASE WHEN 1=1 THEN cast('not-a-date' as sql_variant) ELSE getdate() END
Tímto způsobem tedy můžete vrátit více smíšených datových typů (nejsem si jistý, jak snadné je sql_variant
je však třeba pracovat)
Jinak můžete vrátit NULL
za neplatná data, místo vracení nesmyslných dat nebo přetypování všeho do řetězce, pokud to musíte vrátit.