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 LIKE
e / ou PATINDEX
a 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 VARCHAR
dados (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 a
estará dentro do intervalo de A-Z
um deles, mas não do outro. E o intervalo de a-Z
não corresponderá a nenhum caractere em um agrupamento binário (um que termina em um _BIN
ou _BIN2
, mas não usa _BIN
), considerando que o valor de A
65 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ê NVARCHAR
oferece 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 Replace
mé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 \W
fuga)
-[,]
= subtração de classe (isso é necessário para excluir vírgulas da correspondência como "especial", pois elas estão incluídas na \W
fuga)
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: