sql >> Base de Datos >  >> RDS >> Sqlserver

¿Por qué T-SQL ISNULL() trunca la cadena y COALESCE no?

Según la documentación de Microsoft , para la función:

ISNULL(check_expression, replacement_value)

replacement_value debe ser de un tipo que sea implícitamente convertible al tipo de check_expression . Tenga en cuenta que escriba para 'xy'+NULL es VARCHAR(3) . Debido a esto, su cadena 'ABCDEFGHIJ' se convierte en VARCHAR(3) y así recortado.

Suena extraño por qué no es VARCHAR(2) , pero así son las cosas:un carácter más largo que 'xy' . Puedes jugar con este SQLFiddle y vea por sí mismo ese tipo de 'xy'+NULL es lo mismo que para la expresión CASE WHEN 1=2 THEN 'XYZ' ELSE NULL END , que es NULL pero es implícitamente compatible con VARCHAR(3) .

Parece que para la expresión 'xy'+NULL la longitud percibida se puede calcular como 'xy' longitud de la cadena (2) más 1 por cada NULL adicional. Por ejemplo, escriba 'xy'+NULL+NULL es VARCHAR(4) , escribe para 'xy'+NULL+NULL+NULL es VARCHAR(5) y así sucesivamente:consulte este SQLFiddle . Esto es extremadamente extraño, pero así es como funcionan MS SQL Server 2008 y 2012.