¿Por qué cambiar IsNull por Coalesce?
IsNull es la función de Sql Server que la mayoría de los programadores que llevan unos años escribiendo consultas utilizan. Su función es devolver un valor por defecto si el primer argumento pasado es nulo.
Por ejemplo, supongamos que tenemos la siguiente tabla:
declare @Clientes as table (Id int, Nombre varchar(100));
Y queremos actualizar un campo determinado, por ejemplo el Id=2, para que el nombre coincida con un parámetro que nos pasarán desde programa. Entonces la consulta a ejecutar sería tan sencilla como esta:
update @Clientes set Nombre = @NuevoNombre where Id=2;
Ahora queremos mejorar nuestra consulta, de forma que si el parámetro @NuevoNombre es nulo la fila no se actualice y mantenga su valor. Entonces podríamos substituir la segunda línea por cualquiera de estas dos opciones:
a) set Nombre=IsNull(@NuevoNombre,Nombre);
b) set Nombre=Coalesce(@NuevoNombre,Nombre)
Siempre que el parámetro esté correctamente definido ambas consultas se comportarán igual. El problema viene cuando el parámetro (por ejemplo por utilizar inferencia en el sistema de origen) viene con una definición distinta. Imaginemos por ejemplo que definimos así el parámetro y ejecutamos la consulta:
declare @NuevoNombre as varchar(2)= null;
En el update con calesce el resultado es el esperado, mientras que en el caso de IsNull, la tabla se actualizará incorrectamente. Esto es debido a que realmente IsNull no devuelve el segundo parámetro, sino el resultado de convertir el valor del segundo parámetro al tipo del primero, lo cual consituye una diferencia fundamental.
A continuación listamos el código completo para copiar y pegar y demostrar el funcionamiento. Basta con descomentar alternativamente uno u otro UPDATE para comparar los resultados.
declare @Clientes as table ( Id int, Nombre varchar(100));
insert into @Clientes values
(1,'Francisco Otero'),
(2,'Otro fulano');
declare @NuevoNombre as varchar(2)=null;
--update @Clientes
--set Nombre= @NuevoNombre
--where Id=2
--update @Clientes
--set Nombre=Coalesce(@NuevoNombre,Nombre)
--where Id=1
select * from @Clientes;