ABD İngilizcesi alfabesinin 26 harfini (hem büyük hem de küçük harf versiyonları) kullanmanız garanti edilirse, emin olun LIKE
ve / veya PATINDEX
basit aralık gösterimi ile [a-z]
( büyük / küçük harfe duyarlı olmayan bir Harmanlama kullanırken büyük harf "Z" kullanmanız gerekir).
Eğer tr bulunmayan karakterler alabilirsiniz Ama eğer, çeşitli kod Sayfaları / Harmanlamalar henüz mevcut alfabe VARCHAR
veri (örn Þ
= Latince sermaye "Thorn" = SELECT CHAR(0xDE)
), o zaman karakter sınıfında olanlar dahil etmek gerekebilir: [a-z0-9, Þ]
. Elbette, bu ekstra karakterlerin ne olacağı Kod Başına Sayfa bazındadır.
Ayrıca, hem Harmanlama türünün (SQL Server vs Windows) hem de duyarlılık ayarlarının (büyük / küçük harf duyarlı, duyarlı olmayan ve hassas olmayan) belirli bir aralıkta hangi karakterlerin dahil edileceğini etkileyeceğini unutmayın. Örneğin, SQL Server Harmanlamaları, büyük ve küçük harfleri Windows Harmanlamalarının tersi sırada sıralar. Yani, her iki Harmanlama türü için büyük / küçük harfe duyarlı bir Harmanlama varsayarak biri yapar AaBb...
, diğeri yapar aAbB...
. Etkisi olduğunu olacak a
aralığında olacak A-Z
bunlardan diğeri, ancak diğer değil. Ve değeri , 65 değerinin 65 ve üzeri olması a-Z
koşuluyla, bir ikili Harmanlamadaki herhangi bir karakterle eşleşmez (bunlardan biriyle biten _BIN
veya _BIN2
kullanmayın _BIN
).A
a
97 olduğu için 97 ile 65 ;-) arasında geçersiz bir aralıktır. Burada örnek vermek için çok fazla varyasyon var, bu yüzden yakında blogumda ayrıntılı bir açıklama yayınlamaya çalışacağım (ve daha sonra bunu bağlantıyla güncelleyeceğim). Bununla birlikte, yalnızca ABD İngilizcesi karakterlerini kabul etme konusunda katılacaksanız (diğer dillerden geçerli mektuplar alsanız bile), en iyi seçeneğiniz muhtemelen aşağıdaki deseni ve Harmanlamayı kullanmak olacaktır :
LIKE '%[^A-Za-z0-9, ]%' COLLATE Latin1_General_100_BIN2
Şimdi, NVARCHAR
verileri destekliyorsanız ve çeşitli dillerden "kelime" karakterleri alabiliyorsanız, T-SQL bu şeyleri ayırt etmenin gerçek bir yolu olmadığından çok yardımcı olmayacaktır. Bu durumda, Düzenli İfade (RegEx) - özellikle Replace
yöntem / işlev - kullanmalısınız ve bunlar yalnızca SQLCLR aracılığıyla kullanılabilir. Aşağıda, birkaç "özel" karakterin değiştirilmesine, ancak geçerli harfler olan tüm karakterlerin en az bir dilde bırakılmasına ilişkin bir örnek gösterilmektedir:
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);
İadeler:
this is a TEST, to strip out ç ƒ special ij ೫ chars 舛 დ א B
RegEx ifadesi şu anlama gelir:
\W
= "herhangi bir kelime olmayan karakter" anlamına gelen bir RegEx "kaçış "
\p{Pc}
= "Noktalama, Bağlayıcı" bir Unicode "kategorisi" (bu yalnızca "kategori" \W
kaçış tarafından hariç tutulduğu için eşleşme için gereklidir )
-[,]
= sınıf çıkarma (virgüllerin çıkışa dahil oldukları için virgüllerin "özel" olarak eşlenmesini önlemek için bu gereklidir \W
)
Bir tabloyu güncelleyerek aşağıdakileri yapabilirsiniz:
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;
Bu örnekler için, oluşturduğum SQLCLR işlevlerinin Ücretsiz sürüm SQL # kitaplığında iki işlev kullandığımı unutmayın (ancak yine bunlar ücretsizdir). Ayrıca parametre türleri NVARCHAR(4000)
yerine kullanımı nedeniyle daha hızlı "4k" sürümleri kullandığımı unutmayın NVARCHAR(MAX)
. Verileriniz kullanılıyorsa NVARCHAR(MAX)
işlev adlarından "4k" yi kaldırın.
Lütfen ayrıca bakınız: