Sie können Datentypen in CASE-Ausdrücken nicht mischen (oder zumindest ohne darauf zu achten, dass sie implizit OK umwandeln)
Wenn Sie mit einer Anweisung wie der folgenden konfrontiert werden, verwendet SQL Server die Datentyppriorität, um zu bestimmen, was der allgemeine Datentyp des Ausdrucks sein sollte
SELECT CASE WHEN 1=1 THEN 'not-a-date' ELSE getdate() END
Für die obige datetime
hat Vorrang vor char
daher wird die Zeichenfolge implizit in ein Datum umgewandelt, das fehlschlägt.
Folgendes gelingt jedoch als sql_variant
hat eine höhere Priorität
SELECT CASE WHEN 1=1 THEN cast('not-a-date' as sql_variant) ELSE getdate() END
Auf diese Weise können Sie also mehrere gemischte Datentypen zurückgeben (ich bin mir nicht sicher, wie einfach sql_variant
ist aber zu arbeiten)
Ansonsten könnten Sie NULL
zurückgeben für ungültige Datetimes, anstatt die unsinnigen Daten zurückzugeben oder alles in einen String umzuwandeln, wenn Sie es zurückgeben müssen.