W odpowiedzi Cade Roux występują dwa różne zachowania:zastąpienie powiodło się (gdy używane jest sortowanie SQL) i nie powiodło się (stosowane jest sortowanie Windows). Powodem jest rodzaj użytego sortowania.
To zachowanie zostało zgłoszone firmie Microsoft prawie 4 lata temu:
P: Podczas próby zamiany znaku NUL na replace() działa to, gdy wartość ma sortowanie SQL, ale nie sortowanie Windows.
O: Wynika to z faktu, że 0x0000 jest niezdefiniowanym znakiem w zestawieniach Windows. Wszystkie niezdefiniowane znaki są ignorowane podczas porównywania, sortowania i dopasowywania wzorców. Tak więc szukanie „a” + char(0) to tak naprawdę wyszukiwanie „a”, a szukanie char(0) jest równoznaczne z pustym ciągiem.
Sposób obsługi niezdefiniowanych znaków jest nieco mylący, ale jest to sposób, w jaki Windows zdefiniował ich sortowanie, a SQL Server jest zgodny z ogólnym Windows API.
W zestawieniu SQL nie ma pojęcia niezdefiniowanego znaku. Każdy punkt kodowy ma przypisaną wagę, dlatego nie widzimy tam problemu.
ale niestety nadal nie jest udokumentowane.
Wydaje się więc, że jedynym rozwiązaniem jest zmiana sortowania na sortowanie SQL (np. SQL_Latin1_General_CP1_CI_AS
może być również używany).
Usunąłem moją poprzednią odpowiedź jako niepotrzebną