Det finns två olika beteenden i Cade Roux svar:ersättningen är framgångsrik (när SQL-sortering används) och misslyckad (Windows-sortering används). Anledningen är den typ av sortering som används.
Det här beteendet skickades till Microsoft för nästan fyra år sedan:
F: När du försöker ersätta ett NUL-tecken med replace(), fungerar detta eftersom värdet har en SQL-sortering, men inte en Windows-kollation.
Svar: Detta beror på det faktum att 0x0000 är ett odefinierat tecken i Windowskollationer. Alla odefinierade tecken ignoreras under jämförelse, sortering och mönstermatchning. Så att searing for'a' + char(0) är verkligen att söka efter'a', och att söka efter char(0) motsvarar tom sträng.
Sättet att hantera odefinierade egenskaper är lite förvirrande, men det är så här som Windows definierade för att sortera dem, och SQL Server överensstämmer med det allmänna Windows API.
I SQL-sortering finns det inget begrepp om odefinierat tecken. Varje kodpunkt tilldelas en vikt, det är därför vi inte ser något problem där.
men tyvärr är den fortfarande odokumenterad.
Så det verkar som att den enda lösningen är att ändra sortering till SQL-sortering (t.ex. SQL_Latin1_General_CP1_CI_AS
kan också användas).
Jag tog bort mitt tidigare svar som onödigt