Esistono due comportamenti diversi nella risposta di Cade Roux:la sostituzione ha esito positivo (quando viene utilizzata la confronto SQL) e non riuscita (viene utilizzata la confronto di Windows). Il motivo è nel tipo di confronto utilizzato.
Questo comportamento è stato presentato a Microsoft quasi 4 anni fa:
D: Quando si tenta di sostituire un carattere NUL con replace(), funziona se il valore ha regole di confronto SQL, ma non di Windows.
R: Ciò è dovuto al fatto che 0x0000è un carattere non definito in Windowscollations. Tutti i caratteri non definiti vengono ignorati durante il confronto, l'ordinamento e la corrispondenza dei modelli. Quindi cercare 'a' + char(0) è davvero cercare 'a', e cercare char(0) è equivalente a una stringa vuota.
Il modo di gestire i caratteri non definiti è un po' confuso, ma questo è il modo in cui Windows ha definito l'ordinamento e SQL Server è conforme all'API generale di Windows.
Nelle regole di confronto SQL, non esiste la nozione di carattere non definito. Ad ogni codepoint viene assegnato un peso, ecco perché non vediamo problemi lì.
ma sfortunatamente non è ancora documentato.
Quindi, sembra che l'unica soluzione sia cambiare le regole di confronto in regole di confronto SQL (ad es. SQL_Latin1_General_CP1_CI_AS
può essere utilizzato anche).
Ho rimosso la mia risposta precedente come non necessaria