Jeśli masz gwarancję, że będziesz używać tylko 26 liter alfabetu angielskiego w USA (zarówno duże, jak i małe), to na pewno możesz uniknąć używania LIKE
i / lub PATINDEX
prostej notacji zakresu [a-z]
(nie trzeba użyć wielkiej litery „Z”, gdy używa się sortowania bez rozróżniania wielkości liter).
Ale jeśli można dostać znaki nie występujące w en-us alfabet jeszcze dostępne w różnych stronach Kod / Konfrontacje dla VARCHAR
danych (np Þ
= kapitał Łacińskiej „Thorn” = SELECT CHAR(0xDE)
), to może trzeba należą do klasy postaci: [a-z0-9, Þ]
. Oczywiście, jakie byłyby te dodatkowe znaki, zależnie od strony kodowej.
Należy również pamiętać, że zarówno typ sortowania (SQL Server vs Windows), jak i ustawienia czułości (wielkość liter, akcent itp. Wrażliwe vs niewrażliwe) będą miały wpływ na to, które znaki są zawarte w danym zakresie. Na przykład SQL Server Collations sortuje wielkie i małe litery w odwrotnej kolejności niż Windows Collations. To znaczy, zakładając, że dla obu typów zestawień rozróżniana jest wielkość liter, jedno zrobi, AaBb...
a drugie zrobi aAbB...
. Efekt będzie taki, że a
będzie w zasięgu A-Z
jednego z nich, ale nie drugiego. A zakres a-Z
nie pasuje do żadnych znaków w binarnym Układanie (jeden kończy się albo _BIN
albo _BIN2
, ale nie używać _BIN
) Biorąc pod uwagę, że wartość A
wynosi 65 ia
wynosi 97, stąd jest to nieprawidłowy zakres od 97 do 65 ;-). Istnieje o wiele zbyt wiele odmian, aby podać tutaj przykłady, więc wkrótce postaram się opublikować szczegółowe wyjaśnienie na moim blogu (a następnie zaktualizuję ten link do niego). Jeśli jednak będziesz surowo akceptować tylko znaki amerykańskie w języku angielskim (nawet jeśli możesz otrzymać prawidłowe litery z innych języków), najlepszym rozwiązaniem będzie prawdopodobnie użycie następującego wzoru i sortowania:
LIKE '%[^A-Za-z0-9, ]%' COLLATE Latin1_General_100_BIN2
Teraz, jeśli wspierasz NVARCHAR
dane i możesz uzyskać znaki „słów” z różnych języków, to T-SQL nie będzie zbyt pomocny, ponieważ nie ma realnego sposobu na rozróżnienie tych rzeczy. W takim przypadku należy użyć wyrażenia regularnego (RegEx) - w szczególności Replace
metody / funkcji - i są one dostępne tylko za pośrednictwem SQLCLR. Poniżej pokazano przykład zastąpienia kilku „znaków specjalnych”, ale pozostawiając wszystkie prawidłowe litery w co najmniej jednym języku:
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);
Zwroty:
this is a TEST, to strip out ç ƒ special ij ೫ chars 舛 დ א B
Wyrażenie RegEx oznacza:
\W
= „ucieczka” RegEx oznaczająca „dowolny znak niebędący słowem”
\p{Pc}
= „kategoria” w standardzie Unicode „Interpunkcja, łącznik” (jest to konieczne tylko w przypadku dopasowania, ponieważ ta „kategoria” jest specjalnie wykluczona przez funkcję zmiany znaczenia \W
)
-[,]
= odejmowanie klas (jest to konieczne, aby wykluczyć przecinki z dopasowywania jako „specjalne”, ponieważ są uwzględniane w \W
znaku zmiany znaczenia)
Możesz zrobić aktualizację tabeli, po prostu wydając:
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;
Pamiętaj, że dla tych przykładów użyłem dwóch funkcji dostępnych w bibliotece SQL w wersji darmowej funkcji SQLCLR, które utworzyłem (ale znowu są one bezpłatne). Zauważ też, że użyłem wersji „4k”, które są szybsze ze względu na użycie NVARCHAR(4000)
zamiast NVARCHAR(MAX)
typów parametrów. Jeśli używasz danych NVARCHAR(MAX)
, po prostu usuń „4k” z nazw funkcji.
Zobacz także: