Jika Anda dijamin hanya akan menggunakan 26 huruf alfabet Inggris AS (baik versi huruf besar maupun kecil), tentu saja, Anda dapat menggunakan LIKE
dan / atau PATINDEX
dengan notasi rentang sederhana [a-z]
(Anda tidak akan perlu menggunakan huruf besar "Z" saat menggunakan Collation yang tidak peka huruf besar-kecil).
Tapi, jika Anda bisa mendapatkan karakter yang tidak ditemukan di en-US alfabet belum tersedia dalam berbagai Kode Pages / Collations untuk VARCHAR
data (misalnya Þ
= ibukota Latin "Thorn" = SELECT CHAR(0xDE)
), maka Anda mungkin perlu menyertakan mereka dalam kelas karakter: [a-z0-9, Þ]
. Tentu saja, karakter tambahan apa yang akan dibuat berdasarkan per-Kode Halaman.
Perlu diketahui juga bahwa tipe Collation (SQL Server vs Windows) dan pengaturan sensitivitas (case, accent, dll sensitif vs tidak sensitif) akan mempengaruhi karakter mana yang termasuk dalam kisaran tertentu. Sebagai contoh, SQL Server Collations mengurutkan huruf besar dan kecil dalam urutan yang berlawanan sebagai Windows Collations. Artinya, dengan asumsi Collation peka-huruf besar-kecil untuk kedua jenis Collations, satu akan melakukan AaBb...
dan yang lain akan melakukannya aAbB...
. Efeknya akan berada a
dalam kisaran A-Z
untuk salah satu dari mereka, tetapi tidak yang lain. Dan rentang dari a-Z
tidak akan cocok dengan karakter apa pun dalam Kolasi biner (yang berakhir dengan salah satu _BIN
atau _BIN2
, tetapi tidak menggunakan _BIN
) mengingat bahwa nilai A
65 dana
adalah 97, maka itu adalah kisaran yang tidak valid dari 97 hingga 65 ;-). Ada terlalu banyak variasi untuk memberikan contoh di sini jadi saya akan mencoba memposting penjelasan terperinci di blog saya dalam waktu dekat (dan kemudian akan memperbarui ini dengan tautan ke sana). Namun, jika Anda akan ketat hanya menerima karakter bahasa Inggris AS (bahkan jika Anda mungkin mendapatkan huruf yang valid dari bahasa lain) maka opsi terbaik Anda mungkin akan menggunakan pola dan Kolasi berikut :
LIKE '%[^A-Za-z0-9, ]%' COLLATE Latin1_General_100_BIN2
Sekarang, jika Anda mendukung NVARCHAR
data dan bisa mendapatkan "kata" karakter dari berbagai bahasa, maka T-SQL tidak akan banyak membantu karena tidak memiliki cara nyata untuk membedakan hal-hal ini. Dalam hal ini, Anda harus menggunakan Ekspresi Reguler (RegEx) - khususnya Replace
metode / fungsi - dan itu hanya tersedia melalui SQLCLR. Berikut ini menunjukkan contoh mengganti beberapa karakter "khusus", namun meninggalkan semua yang merupakan huruf yang valid dalam setidaknya satu bahasa:
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);
Pengembalian:
this is a TEST, to strip out ç ƒ special ij ೫ chars 舛 დ א B
Ekspresi RegEx berarti:
\W
= a RegEx "escape" yang berarti " karakter non- kata"
\p{Pc}
= "kategori" Unicode dari "Tanda Baca, Konektor" (ini diperlukan untuk pertandingan hanya karena "kategori" ini dikecualikan secara spesifik oleh \W
pelarian)
-[,]
= pengurangan kelas (ini diperlukan untuk mengecualikan koma dari pencocokan sebagai "spesial" karena mereka termasuk dalam \W
pelarian)
Anda dapat melakukan pembaruan tabel hanya dengan menerbitkan:
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;
Harap perhatikan bahwa untuk contoh-contoh ini, saya menggunakan dua fungsi yang tersedia di pustaka SQL # SQL versi gratis dari fungsi SQLCLR, yang saya buat (tapi sekali lagi, ini gratis). Perhatikan juga bahwa saya menggunakan versi "4k" yang lebih cepat karena menggunakan NVARCHAR(4000)
bukan NVARCHAR(MAX)
tipe parameter. Jika data Anda menggunakan NVARCHAR(MAX)
, maka hapus saja "4k" dari nama fungsi.
Silakan juga lihat: