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

Perché T-SQL ISNULL() tronca la stringa e COALESCE no?

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.