В отговора на Cade Roux има две различни поведения:замяната е успешна (когато се използва SQL съпоставяне) и неуспешна (използва се съпоставяне на Windows). Причината е във вида на използваното съпоставяне.
Това поведение беше изпратено на Microsoft преди близо 4 години:
В: Когато се опитвате да замени NUL символ с replace(), това работи, ако стойността има SQL съпоставяне, но не и сравнение на Windows.
А: Това се дължи на факта, че 0x0000 е недефиниран знак в Windowscollations. Всички недефинирани знаци се игнорират по време на сравнение, сортиране и съвпадение на шаблон. Така че търсенето на „a“ + char(0) наистина е търсене на „a“, а търсенето на char(0) е еквивалентно на празен низ.
Начинът за обработка на недефинирани символи е малко объркващ, но това е начинът, който Windows дефинира за сортирането им, а SQL Server отговаря на общия API на Windows.
В SQL съпоставянето няма понятие за недефиниран символ. На всяка кодова точка е присвоена тежест, затова не виждаме проблем там.
но за съжаление все още не е документирано.
Така че изглежда единственото решение е да промените съпоставянето към SQL съпоставяне (напр. SQL_Latin1_General_CP1_CI_AS
може да се използва също).
Премахнах предишния си отговор като ненужен