sqlserver nullif not español ejemplo sql-server tsql coalesce isnull truncation

sql-server - nullif - select coalesce sql server



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

Dado lo siguiente:

SELECT ISNULL(''XY'' + NULL, ''ABCDEFGHIJ'') -- Outputs ABC (Why?) SELECT COALESCE(''XY'' + NULL, ''ABCDEFGHIJ'') -- Outputs ABCDEFGHIJ

¿Por qué estas declaraciones están dando resultados diferentes?



Según la documentation Microsoft, para función:

ISNULL(check_expression, replacement_value)

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

Suena extraño por qué no es VARCHAR(2) , pero así es, un carácter más largo que ''xy'' . Puedes jugar con este SQLFiddle y ver por ti mismo que el tipo para ''xy''+NULL es el 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 cadena (2) más 1 por cada NULL agregado. Por ejemplo, el tipo de ''xy''+NULL+NULL es VARCHAR(4) , el tipo de ''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.


ISNULL() convierte el valor de reemplazo al tipo de la expresión de verificación. En este caso, el tipo de la expresión de verificación es CHAR(2) , por lo que convertir el valor de reemplazo lo trunca (¿está seguro de que está obteniendo ABC y no solo AB ?).

De la documentation Microsoft:

replacement_value puede truncarse si replacement_value es más largo que check_expression .