Secondo Microsoft documentation, per la funzione:
ISNULL(check_expression, replacement_value)
replacement_value
deve essere di un tipo che è implicitamente convertibile al tipo di check_expression
. Si noti che il tipo per 'xy'+NULL
è VARCHAR(3)
. Per questo motivo, la stringa 'ABCDEFGHIJ'
viene convertita in VARCHAR(3)
e quindi ritagliata.
Sembra strano il motivo per cui non è VARCHAR(2)
, ma questo è il modo in cui è: un carattere più lungo di 'xy'
. È possibile giocare con questo SQLFiddle e verificare personalmente che il tipo per 'xy'+NULL
sia lo stesso per l'espressione CASE WHEN 1=2 THEN 'XYZ' ELSE NULL END
, che è NULL
ma è implicitamente compatibile con VARCHAR(3)
.
Sembra che per l'espressione 'xy'+NULL
la lunghezza percepita possa essere calcolata come 'xy'
lunghezza della stringa (2) più 1 per ogni NULL
aggiunto. Ad esempio, il tipo di 'xy'+NULL+NULL
è VARCHAR(4)
, il tipo per 'xy'+NULL+NULL+NULL
è VARCHAR(5)
e così via - controlla questo SQLFiddle. Questo è estremamente strano, ma è così che funzionano MS SQL Server 2008 e 2012.
Una buona spiegazione, anche se non sono convinto del varchar (3) invece di varchar (2) - Non riesco a trovarlo documentato da nessuna parte. – natenho
Prova che è VARCHAR (3): http://sqlfiddle.com/#!3/d41d8/20987 – mvp
Devo aumentare le informazioni qui per spiegare meglio il comportamento di COALESCE rispetto al comportamento ISNULL, da Microsoft [documentazione] (http://technet.microsoft.com/en-us/library/ms190349.aspx): L'espressione COALESCE è una scorciatoia sintattica per l'espressione CASE. Cioè, il codice COALESCE (espressione1, ... n) viene riscritto da Query Optimizer come la seguente espressione CASE: CASE QUANDO (espressione1 IS NOT NULL) THEN espressione1 QUANDO (espressione2 IS NOT NULL) quindi expression2 ... ELSE expressionN END -> Il tipo di ritorno del caso è dato dalla massima priorità expr. – natenho