Se sei sicuro di usare sempre e solo le 26 lettere dell'alfabeto inglese americano (sia maiuscole che minuscole), puoi sicuramente cavartela usando LIKE
e / o PATINDEX
con la semplice notazione di intervallo di [a-z]
(non è necessario utilizzare una "Z" maiuscola quando si utilizza una raccolta senza distinzione tra maiuscole e minuscole).
Ma, se si potrebbe ottenere caratteri non presenti nel it-IT alfabeto ancora disponibile in varie Codice Pages / Regole di confronto per i VARCHAR
dati (ad esempio Þ
= capitale latino "Thorn" = SELECT CHAR(0xDE)
), allora si potrebbe aver bisogno di includere quelli della classe di caratteri: [a-z0-9, Þ]
. Ovviamente, quali sarebbero questi caratteri extra è basato su una pagina per codice.
Inoltre, tenere presente che sia il tipo di regole di confronto (SQL Server rispetto a Windows) sia le impostazioni di sensibilità (maiuscole, accento, ecc. Sensibili o insensibili) influenzeranno i caratteri inclusi in un determinato intervallo. Ad esempio, le regole di confronto di SQL Server ordinano le lettere maiuscole e minuscole nell'ordine opposto rispetto alle regole di confronto di Windows. Significa che, supponendo un confronto con distinzione tra maiuscole e minuscole per entrambi i tipi di confronto, uno farà AaBb...
e l'altro farà aAbB...
. L'effetto sarà che a
rientrerà nel range di A-Z
uno di essi, ma non l'altro. E l'intervallo di a-Z
non corrisponderà a nessun personaggio in un confronto binario (uno che termina in uno _BIN
o _BIN2
, ma non usare _BIN
) dato che il valore di A
è 65 ea
è 97, quindi è un intervallo non valido da 97 a 65 ;-). Ci sono troppe varianti per fornire esempi per questo, quindi proverò a pubblicare una spiegazione dettagliata sul mio blog a breve (e poi aggiornerò questo con il link ad esso). Tuttavia, se stai per essere severo nell'accettare solo caratteri inglesi statunitensi (anche se potresti ottenere lettere valide da altre lingue), la tua migliore opzione sarà probabilmente quella di utilizzare il seguente schema e le seguenti regole di confronto:
LIKE '%[^A-Za-z0-9, ]%' COLLATE Latin1_General_100_BIN2
Ora, se stai supportando i NVARCHAR
dati e puoi ottenere caratteri "word" da varie lingue, allora T-SQL non sarà di grande aiuto in quanto non ha un modo reale di differenziare queste cose. In questo caso, è necessario utilizzare un'espressione regolare (RegEx), in particolare il Replace
metodo / la funzione, e questi sono disponibili solo tramite SQLCLR. Quanto segue mostra un esempio di sostituzione di più caratteri "speciali", lasciando tutte le lettere valide in almeno una lingua:
DECLARE @Test NVARCHAR(500);
SET @Test = N'this$is%a<>TEST,;to}⌡↕strip╞╟╚══¶out_ç_ƒ▀ special-ij-೫-chars-舛-დ-א-B';
SELECT SQL#.RegEx_Replace4k(@Test, N'[\W\p{Pc}-[,]]', N' ', -1, 1, NULL);
Ritorna:
this is a TEST, to strip out ç ƒ special ij ೫ chars 舛 დ א B
L'espressione RegEx significa:
\W
= una "escape" RegEx che significa "qualsiasi carattere non- parola"
\p{Pc}
= una "categoria" Unicode di "Punteggiatura, Connettore" (questo è necessario per la corrispondenza solo perché questa "categoria" è specificamente esclusa dalla \W
fuga)
-[,]
= sottrazione di classe (è necessario per escludere le virgole dalla corrispondenza come "speciale" poiché sono incluse nell'escape \W
)
Puoi fare un aggiornamento di una tabella semplicemente emettendo:
UPDATE tbl
SET tbl.field = SQL#.RegEx_Replace4k(tbl.field, N'[\W\p{Pc}-[,]]', N' ', -1, 1, NULL)
FROM tbl
WHERE SQL#.RegEx_IsMatch4k(tbl.field, N'[\W\p{Pc}-[,]]', 1, NULL) = 1;
Si noti che per questi esempi, ho usato due funzioni disponibili nella libreria SQL # versione gratuita delle funzioni SQLCLR, che ho creato (ma, di nuovo, sono gratuite). Si noti inoltre che ho usato le versioni "4k" che sono più veloci a causa dell'utilizzo NVARCHAR(4000)
invece dei NVARCHAR(MAX)
tipi di parametri. Se i tuoi dati stanno utilizzando NVARCHAR(MAX)
, rimuovi semplicemente "4k" dai nomi delle funzioni.
Vedi anche: