Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SELECT CASE CAST Konvertierungsfehler

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.