Secondo la documentazione di Microsoft , per la funzione:
ISNULL(check_expression, replacement_value)
replacement_value
deve essere di un tipo convertibile in modo implicito nel tipo di check_expression
. Nota che digita 'xy'+NULL
è VARCHAR(3)
. Per questo motivo la tua stringa 'ABCDEFGHIJ'
viene trasmesso a VARCHAR(3)
e quindi tagliato.
Sembra strano perché non è VARCHAR(2)
, ma è così:un carattere più lungo di 'xy'
. Puoi giocare con questo SQLFiddle
e guarda tu stesso quel tipo per 'xy'+NULL
è lo stesso dell'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 può essere calcolata come 'xy'
lunghezza della stringa (2) più 1 per ogni NULL
aggiunto. Ad esempio, digita 'xy'+NULL+NULL
è VARCHAR(4)
, digita 'xy'+NULL+NULL+NULL
è VARCHAR(5)
e così via:dai un'occhiata a questo SQLFiddle
. È estremamente strano, ma è così che funzionano MS SQL Server 2008 e 2012.