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.