Se você tiver a garantia de usar apenas as 26 letras do alfabeto em inglês dos EUA (versões em maiúsculas e minúsculas), com certeza, poderá usar LIKEe / ou PATINDEXa notação simples de faixa [a-z](você não usaria precisa usar um "Z" maiúsculo ao usar um agrupamento que não diferencia maiúsculas de minúsculas).
Mas, se você pode obter caracteres não encontrados na casa de US alfabeto ainda disponíveis em várias páginas de código / agrupamentos de VARCHARdados (por exemplo Þ= capitais Latina "Thorn" = SELECT CHAR(0xDE)), então você pode precisar incluir aquelas na classe de caracteres: [a-z0-9, Þ]. Obviamente, o que esses caracteres extras seriam é por página de código.
Além disso, esteja ciente de que tanto o tipo de agrupamento (SQL Server x Windows) quanto as configurações de sensibilidade (maiúsculas e minúsculas, sotaque etc. sensíveis versus não sensíveis) afetarão quais caracteres estão incluídos em um determinado intervalo. Por exemplo, os agrupamentos do SQL Server classificam letras maiúsculas e minúsculas na ordem oposta aos agrupamentos do Windows. Ou seja, assumindo um agrupamento que diferencia maiúsculas de minúsculas para ambos os tipos de agrupamentos, um fará AaBb...e o outro fará aAbB.... O efeito será que aestará dentro do intervalo de A-Zum deles, mas não do outro. E o intervalo de a-Znão corresponderá a nenhum caractere em um agrupamento binário (um que termina em um _BINou _BIN2, mas não usa _BIN), considerando que o valor de A65 eaé 97, portanto, é um intervalo inválido de 97 a 65 ;-). Existem muitas variações para dar exemplos aqui, então tentarei postar uma explicação detalhada em meu blog em breve (e atualizarei isso com o link para ele). No entanto, se você for rigoroso em aceitar apenas caracteres em inglês dos EUA (mesmo que receba cartas válidas de outros idiomas), sua melhor opção provavelmente será usar o seguinte padrão e agrupamento:
LIKE '%[^A-Za-z0-9, ]%' COLLATE Latin1_General_100_BIN2
Agora, se você NVARCHARoferece suporte a dados e pode obter caracteres "word" de vários idiomas, o T-SQL não será de grande ajuda, pois não há uma maneira real de diferenciar essas coisas. Nesse caso, você deve usar uma Expressão Regular (RegEx) - especificamente o Replacemétodo / função - e essas estão disponíveis apenas através do SQLCLR. A seguir, é mostrado um exemplo de substituição de vários caracteres "especiais", deixando todas as letras válidas em pelo menos um idioma:
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);
Devoluções:
this is a TEST, to strip out ç ƒ special ij ೫ chars 舛 დ א B
A expressão RegEx significa:
\W= um "escape" RegEx que significa "qualquer caractere não- palavra"
\p{Pc}= uma "categoria" Unicode de "Pontuação, conector" (isso é necessário para a correspondência apenas porque essa "categoria" é especificamente excluída pela \Wfuga)
-[,]= subtração de classe (isso é necessário para excluir vírgulas da correspondência como "especial", pois elas estão incluídas na \Wfuga)
Você pode fazer uma atualização de uma tabela simplesmente emitindo:
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;
Observe que, para esses exemplos, usei duas funções disponíveis na biblioteca SQL # versão gratuita das funções SQLCLR, que eu criei (mas, novamente, elas são gratuitas). Observe também que usei as versões "4k", que são mais rápidas devido ao uso em NVARCHAR(4000)vez dos NVARCHAR(MAX)tipos de parâmetros. Se seus dados estiverem sendo usados NVARCHAR(MAX), remova o "4k" dos nomes das funções.
Veja também: