米国英語のアルファベット(大文字と小文字の両方のバージョン)の26文字のみを使用することが保証されている場合は、確かに、使用LIKE
したりPATINDEX
、簡単な範囲表記[a-z]
(または、大文字と小文字を区別しない照合を使用する場合は、大文字の「Z」を使用する必要があります)。
ただし、en-USアルファベットにはない文字がVARCHAR
データのさまざまなコードページ/照合で利用できる場合(例Þ
=ラテン大文字 "Thorn" = SELECT CHAR(0xDE)
)、その文字クラスに含める必要がある場合があります[a-z0-9, Þ]
。もちろん、これらの余分な文字はコードページごとです。
また、照合タイプ(SQL ServerとWindows)と感度の設定(大文字と小文字、アクセントなど、大文字と小文字を区別)は、特定の範囲に含まれる文字に影響することに注意してください。たとえば、SQL Server照合順序は、大文字と小文字をWindows照合順序とは逆の順序で並べ替えます。AaBb...
つまり、両方の種類の照合で大文字と小文字が区別される照合を想定すると、一方が実行され、もう一方が実行されますaAbB...
。その効果は、一方のa
範囲内にありA-Z
、もう一方の範囲内にはありません。そして、の範囲は、a-Z
バイナリ照合(のいずれかで終わる1内の任意の文字と一致していないだろう_BIN
か_BIN2
、しかし使わない_BIN
の値が与えられたことを)A
65で、a
は97なので、97から65の無効な範囲です;-)。バリエーションが多すぎてここでの例を示すことができないので、近いうちにブログに詳細な説明を投稿するつもりです(それから、これへのリンクでこれを更新します)。ただし、他の言語から有効な文字を取得する場合でも、米国英語の文字のみを受け入れることに厳格になる場合は、おそらく次のパターンと照合順序を使用することをお勧めします。
LIKE '%[^A-Za-z0-9, ]%' COLLATE Latin1_General_100_BIN2
NVARCHAR
データをサポートしていて、さまざまな言語から「単語」文字を取得できる場合、T-SQLはこれらを区別するための実際の方法がないため、あまり役に立ちません。この場合、正規表現(RegEx)、具体的にはReplace
メソッド/関数を使用する必要があります。これらはSQLCLRを通じてのみ使用できます。以下は、いくつかの「特殊」文字を置き換えるが、少なくとも1つの言語で有効な文字をすべて残す例を示しています。
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);
戻り値:
this is a TEST, to strip out ç ƒ special ij ೫ chars 舛 დ א B
RegEx式の意味は次のとおりです。
\W
=「単語以外の文字」を意味するRegEx「エスケープ」
\p{Pc}
=「句読点、コネクタ」のUnicode「カテゴリ」(この「カテゴリ」は\W
エスケープによって明確に除外されているため、これは一致にのみ必要)
-[,]
=クラスの減算(これは、\W
エスケープに含まれているため、「特殊」としてコンマをマッチングから除外するために必要です)
次のコマンドを発行するだけで、テーブルを更新できます。
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;
これらの例では、私が作成したSQLCLR関数の無料バージョンSQL#ライブラリで使用可能な2つの関数を使用したことに注意してください(ただし、これらも無料です)。またNVARCHAR(4000)
、NVARCHAR(MAX)
パラメータタイプの代わりに使用するため、より高速な「4k」バージョンを使用したことにも注意してください。データがを使用している場合はNVARCHAR(MAX)
、関数名から「4k」を削除するだけです。
こちらもご覧ください: