หากคุณรับประกันว่าจะใช้เพียง 26 ตัวอักษรของตัวอักษรภาษาอังกฤษแบบสหรัฐอเมริกา (ทั้งตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก) คุณสามารถหลีกเลี่ยงการใช้งานLIKE
และ / หรือPATINDEX
ด้วยสัญกรณ์ช่วงง่าย ๆ ของ[a-z]
(คุณจะไม่ จำเป็นต้องใช้ตัวพิมพ์ใหญ่ "Z" เมื่อใช้การเปรียบเทียบแบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่)
แต่ถ้าคุณอาจได้รับตัวละครที่ไม่พบใน en-US อักษรยังไม่มีให้บริการในหลายรหัสหน้า / Collations สำหรับVARCHAR
ข้อมูล (เช่นÞ
= ทุนละติน "ธ อร์น" = SELECT CHAR(0xDE)
) [a-z0-9, Þ]
แล้วคุณอาจจำเป็นต้องมีผู้ที่อยู่ในระดับตัวอักษร: แน่นอนว่าสิ่งที่ตัวละครพิเศษเหล่านั้นจะอยู่บนพื้นฐานของรหัสต่อหน้า
นอกจากนี้โปรดทราบว่าทั้งการเปรียบเทียบประเภท (SQL Server vs Windows) และการตั้งค่าความไว (ตัวพิมพ์เล็กและใหญ่เน้นความอ่อนไหวและไม่อ่อนไหว) จะส่งผลต่ออักขระที่รวมอยู่ในช่วงใดช่วงหนึ่ง ตัวอย่างเช่น SQL Server Collations เรียงลำดับตัวพิมพ์ใหญ่และตัวพิมพ์เล็กตามลำดับตรงกันข้ามเป็น Windows Collations ความหมายสมมติว่าเป็นกรณี ๆ ไปเปรียบเทียบสำหรับทั้งสองประเภทของ Collations หนึ่งจะทำAaBb...
และอื่น ๆ aAbB...
ที่จะทำ เอฟเฟ็กต์จะa
อยู่ภายในขอบเขตของA-Z
หนึ่งในนั้น แต่ไม่ใช่เอฟเฟกต์อื่น และช่วงของa-Z
จะไม่ตรงกับตัวละครใด ๆ ในการจัดเรียงแบบไบนารี (หนึ่งที่ลงท้ายด้วยอย่างใดอย่างหนึ่ง_BIN
หรือ_BIN2
แต่ไม่ได้ใช้_BIN
) เนื่องจากค่าของA
65 และa
คือ 97 ดังนั้นจึงเป็นช่วงที่ไม่ถูกต้องคือ 97 ถึง 65 ;-) มีตัวอย่างมากเกินไปที่จะให้ตัวอย่างสำหรับที่นี่ดังนั้นฉันจะพยายามโพสต์คำอธิบายอย่างละเอียดในบล็อกของฉันในไม่ช้า (และจากนั้นจะอัปเดตสิ่งนี้ด้วยลิงก์ไปยังมัน) อย่างไรก็ตามหากคุณเข้มงวดกับการยอมรับตัวอักษรภาษาอังกฤษแบบสหรัฐอเมริกาเท่านั้น (แม้ว่าคุณจะได้รับจดหมายที่ถูกต้องจากภาษาอื่น) ตัวเลือกที่ดีที่สุดของคุณอาจจะใช้รูปแบบและการจัดเรียงต่อไปนี้:
LIKE '%[^A-Za-z0-9, ]%' COLLATE Latin1_General_100_BIN2
ตอนนี้ถ้าคุณกำลังสนับสนุนNVARCHAR
ข้อมูลและสามารถรับตัวอักษร "คำ" จากภาษาต่าง ๆ T-SQL จะไม่ได้รับความช่วยเหลือเท่าที่ควรเนื่องจากไม่มีวิธีที่จะแยกแยะสิ่งเหล่านี้ได้ ในกรณีนี้คุณควรใช้ Regular Expression (RegEx) - โดยเฉพาะReplace
เมธอด / ฟังก์ชั่น - และมีให้เฉพาะผ่าน SQLCLR ต่อไปนี้แสดงตัวอย่างของการแทนที่อักขระ "พิเศษ" หลายตัว แต่ยังคงไว้ซึ่งตัวอักษรที่ถูกต้องในภาษาอย่างน้อยหนึ่งภาษา:
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}
= a 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;
โปรดทราบว่าสำหรับตัวอย่างเหล่านี้ฉันใช้สองฟังก์ชั่นที่มีอยู่ในไลบรารี่SQL #เวอร์ชันฟรีของฟังก์ชั่น SQLCLR ซึ่งฉันสร้างขึ้น (แต่อีกครั้งสิ่งเหล่านี้ฟรี) โปรดทราบว่าฉันใช้รุ่น "4k" ซึ่งเร็วกว่าเนื่องจากใช้NVARCHAR(4000)
แทนNVARCHAR(MAX)
พารามิเตอร์ชนิด หากข้อมูลของคุณใช้NVARCHAR(MAX)
อยู่ให้ลบ "4k" ออกจากชื่อฟังก์ชัน
โปรดดู: