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?
Puedes ver toda la diferencia aquí, es muy claro.
MSDN: http://msdn.microsoft.com/en-us/library/ms190349.aspx
Blog de MSDN: http://blogs.msdn.com/b/sqltips/archive/2008/06/26/differences-between-isnull-and-coalesce.aspx
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_valuepuede truncarse sireplacement_valuees más largo quecheck_expression.