Hay dos comportamientos diferentes en la respuesta de Cade Roux:el reemplazo es exitoso (cuando se usa la intercalación de SQL) y no tiene éxito (se usa la intercalación de Windows). El motivo está en el tipo de intercalación utilizada.
Este comportamiento se envió a Microsoft hace casi 4 años:
P: Al intentar reemplazar un carácter NUL con replace(), esto funciona si el valor tiene una intercalación de SQL, pero no una intercalación de Windows.
La forma de manejar caracteres indefinidos es un poco confusa, pero esta es la forma en que Windows definió para clasificarlos, y SQL Server se ajusta a la API general de Windows.
En la intercalación de SQL, no existe la noción de carácter indefinido. A cada punto de código se le asigna un peso, por eso no vemos ningún problema allí.
pero desafortunadamente, todavía no está documentado.
Entonces, parece que la única solución es cambiar la intercalación a la intercalación SQL (por ejemplo, SQL_Latin1_General_CP1_CI_AS
también se puede usar).
Eliminé mi respuesta anterior por innecesaria