Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SELECT CASE CAST Errore di conversione

Non puoi mischiare i tipi di dati nelle espressioni CASE (o almeno senza fare attenzione che trasmettano implicitamente OK)

quando si confronta con una affermazione come la seguente SQL Server utilizzerà la precedenza del tipo di dati per determinare quale dovrebbe essere il tipo di dati complessivo dell'espressione

SELECT CASE WHEN 1=1 THEN 'not-a-date' ELSE getdate() END

Per il datetime di cui sopra ha una precedenza maggiore di char quindi esegue il cast implicito della stringa su una data che non riesce.

Il seguente riesce comunque come sql_variant ha una precedenza maggiore

SELECT CASE WHEN 1=1 THEN cast('not-a-date' as sql_variant) ELSE getdate() END

Quindi puoi restituire più tipi di dati misti in questo modo (non sono sicuro di quanto sia facile sql_variant è con cui lavorare)

A parte questo potresti restituire NULL per datetime non valide invece di restituire i dati senza senso o eseguire il cast di tutto in una stringa se è necessario restituirla.