2015-05-06 13 views
6

Impossibile sostituire un carattere speciale. Potresti per favore aiutarmi su questo.sql server sostituire carattere speciale con null

il mio ingresso è:

Mrs঩Montero 

uscita dovrebbe essere:

Mrs Montero 

carattere speciale non viene visualizzato correttamente. per favore vedi l'immagine qui sotto. http://i.stack.imgur.com/b2SdY.jpg

+0

Cosa hai provato? –

+0

potresti scrivere una funzione sql che rimuove tutti i valori non di carattere (o hai bisogno anche di numeri?) –

+2

Perché questo taggato è netezza? –

risposta

1

Dal source è possibile creare una funzione come questa:

create function dbo.RemoveSpecialChars (@s varchar(256)) returns varchar(256) 
    with schemabinding 
begin 
    if @s is null 
     return null 
    declare @s2 varchar(256) 
    set @s2 = '' 
    declare @l int 
    set @l = len(@s) 
    declare @p int 
    set @p = 1 
    while @p <= @l begin 
     declare @c int 
     set @c = ascii(substring(@s, @p, 1)) 
     if @c between 48 and 57 or @c between 65 and 90 or @c between 97 and 122 
     set @s2 = @s2 + char(@c) 
     set @p = @p + 1 
     end 
    if len(@s2) = 0 
     return null 
    return @s2 
    end 

SQL FIDDLE DEMO

E se avete solo carattere speciale, allora è possibile utilizzare questo:

SELECT replace('Mrs঩Montero', '঩', ' ') 

SQL FIDDLE DEMO

+0

Sebbene il codice copiato/incollato rimuova caratteri speciali, rimuoverà anche caratteri come il trattino '-', che è un carattere valido nei nomi con trattino, quindi potrebbe non essere la soluzione migliore. Il codice che hai copiato rimuove semplicemente tutto ciò che non è A-Z o 0-9. Penso che rimuoverà anche gli spazi, che immagino non sarebbero desiderabili – Tanner

+0

@Tanner: - Infatti, suppongo che per ottenere la soluzione generica OP debba aggiungere ulteriori intervalli e controlli per sfuggire a quei caratteri speciali come il trattino. Altrimenti se ci sono alcuni caratteri speciali specifici, allora usare la funzione 'replace' è anche buono. –

2

Se siete semplicemente selezionando poi fare:

Select Replace(textct, Special_char, ' ') 
from mytable 

se si sta aggiornando quindi fare questo:

Update mytable 
Set textct = Replace(textct, Special_char, ' ') 

presupponendo che siano nvarchars quindi fare questo:

Select Replace(cast(textct as varchar),cast(Special_char as varchar), ' ') 
from mytable 

Se si desidera rimuovere tutti i caratteri speciali è necessario utilizzare una funzione iOn come questo:

Create Function RemoveSpecialCharacters (@text nvarchar(max)) 
Returns varchar(4000) 
AS 
BEGIN 
Declare @Return varchar(4000) = Cast(@text as varchar(4000)) 

While PatIndex('%[^a-z ]%', @Return) > 0 
     Set @Return = Stuff(@Return, PatIndex('%[^a-z ]%', @text), 1, ' ') 

Return @Return 
END 

Select RemoveSpecialCharacters(textct) from mytable 
+0

Ciao Chris, la tua ipotesi è corretta. È una colonna nvarchar. Source ha più di una tabella codici NLS. alcuni esempi: Mrs ঩ Montero, Mr ቙ 嫁 Bell, ׎׌א׊ דרקון ... come la lingua ebraica, le lingue Uk latin9. quando provo a copiare incolla il carattere speciale nel comando replace, il simbolo sta cambiando. così incapace di sostituire. Se convertiamo nvarchar in varchar, esiste la possibilità di modificare i caratteri NLS validi. Devo sostituire solo il carattere ঩. – srinath

+0

Sì, è più o meno quello che farà la conversione in varchar. Non consentirà più quei personaggi speciali e quindi raccoglierà il carattere and e lo sostituirà. Quindi sì, se fai solo un Select Replace (cast (textct as varchar), '঩', '') allora spero che dovresti vedere un po 'di gioia. In bocca al lupo! –

+0

Ho bisogno di tutti i caratteri speciali tranne "঩". perché è una colonna nvarchar. – srinath

1

È possibile

select 
    textct, 
    replace(textct collate Latin1_General_BIN, nchar(2473), ' ') 
from 
    mytable 
2

Creare questa funzione:

CREATE function RemoveSpecialCharacters(@Temp nvarchar(4000)) 
returns varchar(4000) 
as 
BEGIN 
    DECLARE @KeepValues as varchar(100) 
    -- you can add more characters like hyphen if you also want to keep those 
    SET @KeepValues = '%[^A-Z0-9 ]%' 
    WHILE PatIndex(@KeepValues, @Temp) > 0 
    SET @Temp = Stuff(@Temp, PatIndex(@KeepValues, 1, ' ') 
    RETURN @Temp 
END 

Ora è possibile sostituire i caratteri.

SELECT dbo.RemoveSpecialCharacters('abc!"¤# ?123') 

Risultato:

abc  123 
Problemi correlati