2012-01-19 38 views
49

Tôi đang tìm cách thay thế/mã hóa văn bản sử dụng RegEx dựa trên các thiết lập RegEx/params dưới đây:Sử dụng Regex trong SQL Server

RegEx.IgnoreCase = True  
RegEx.Global = True  
RegEx.Pattern = "[^a-z\d\s.]+" 

Tôi đã thấy một số ví dụ về RegEx, nhưng bối rối như thế nào để áp dụng nó theo cùng một cách trong SQL Server. Bất kỳ đề nghị sẽ là hữu ích. Cảm ơn bạn.

+0

Hi mất xem bài viết này: http://www.codeproject.com/Articles/42764/Regular-Expre ssions-in-MS-SQL-Server-2005-2008 – Mohsen

+0

Ngoài ra còn có một giải pháp ** TSQL ** ** + Windows API ** tại [Robyn Page và Phil Factor's] (https: //www.simple-talk). com/sql/t-sql-programming/tsql-regular-expression-workbench /) dựa trên [VBScript.RegExp] (https://msdn.microsoft.com/en-us/library/ee236360%28v=vs. 84% 29.aspx) lớp, mà, tôi tin rằng, được vận chuyển trên mọi phiên bản Windows kể từ Windows 2000. –

+0

Nếu bạn hoàn toàn cần RegEx qua TSQL, một tùy chọn cho SQL Server 2016 trở lên là [sử dụng dịch vụ R] (https : //stackoverflow.com/questions/194652/sql-server-regular-expressions-in-t-sql/46536661#46536661). – DMason

Trả lời

64

Bạn không cần phải tương tác với mã số quản lý, như bạn có thể sử dụng LIKE:

CREATE TABLE #Sample(Field varchar(50), Result varchar(50)) 
GO 
INSERT INTO #Sample (Field, Result) VALUES ('ABC123 ', 'Do not match') 
INSERT INTO #Sample (Field, Result) VALUES ('ABC123.', 'Do not match') 
INSERT INTO #Sample (Field, Result) VALUES ('ABC123&', 'Match') 
SELECT * FROM #Sample WHERE Field LIKE '%[^a-z0-9 .]%' 
GO 
DROP TABLE #Sample 

Là biểu hiện của bạn kết thúc với + bạn có thể đi với '%[^a-z0-9 .][^a-z0-9 .]%'

EDIT: để làm cho rõ ràng: SQL Server không hỗ trợ các biểu thức chính quy mà không có mã được quản lý. Tùy thuộc vào tình hình, nhà điều hành LIKE có thể là một tùy chọn, nhưng thiếu tính linh hoạt mà biểu thức chính quy cung cấp.

+5

@MikeYoung, bạn nói đúng. Câu trả lời này giải quyết không chính xác '+' quantifier là '{1,2}' khi nó nên lấy nó như '{1,}'. Đáng ngạc nhiên, điều này đã làm việc cho OP. –

+1

Điều này sẽ không hoạt động trong máy chủ sql vì nó không hỗ trợ regex. – VVN

+5

@VVN, 'LIKE' không phải là regex (đó là một cú pháp mẫu phù hợp hơn), vì vậy việc thiếu hỗ trợ regex không có nghĩa là điều này sẽ không hoạt động. –

5

Bạn sẽ phải xây dựng quy trình CLR cung cấp chức năng regex, như this article minh họa.

+0

Đây là trong ASP cổ điển, nó có hỗ trợ không? Tôi nghĩ CLR chỉ dành cho các hàm .NET, đúng không? –

+4

Các thủ tục CLR được cài đặt vào môi trường SQL Server và có thể được gọi như bất kỳ thủ tục lưu sẵn khác hoặc hàm do người dùng định nghĩa, vì vậy nếu ASP cổ điển có thể gọi thủ tục được lưu trữ hoặc hàm do người dùng xác định, nó có thể gọi thủ tục CLR. – mwigdahl

1
SELECT * from SOME_TABLE where NAME like '%[^A-Z]%' 

Hoặc một số biểu hiện khác thay vì AZ

5

phiên bản sửa đổi của Hơi Julio's answer.

-- MS SQL using VBScript Regex 
-- select dbo.RegexReplace('aa bb cc','($1) ($2) ($3)','([^\s]*)\s*([^\s]*)\s*([^\s]*)') 
-- $$ dollar sign, $1 - $9 back references, $& whole match 

CREATE FUNCTION [dbo].[RegexReplace] 
( -- these match exactly the parameters of RegExp 
    @searchstring varchar(4000), 
    @replacestring varchar(4000), 
    @pattern varchar(4000) 
) 
RETURNS varchar(4000) 
AS 
BEGIN 
    declare @objRegexExp int, 
     @objErrorObj int, 
     @strErrorMessage varchar(255), 
     @res int, 
     @result varchar(4000) 

    if(@searchstring is null or len(ltrim(rtrim(@searchstring))) = 0) return null 
    set @result='' 
    exec @res=sp_OACreate 'VBScript.RegExp', @objRegexExp out 
    if(@res <> 0) return '..VBScript did not initialize' 
    exec @res=sp_OASetProperty @objRegexExp, 'Pattern', @pattern 
    if(@res <> 0) return '..Pattern property set failed' 
    exec @res=sp_OASetProperty @objRegexExp, 'IgnoreCase', 0 
    if(@res <> 0) return '..IgnoreCase option failed' 
    exec @res=sp_OAMethod @objRegexExp, 'Replace', @result OUT, 
     @searchstring, @replacestring 
    if(@res <> 0) return '..Bad search string' 
    exec @res=sp_OADestroy @objRegexExp 
    return @result 
END 

Bạn sẽ cần thủ tục Ole Tự động bật trong SQL:

exec sp_configure 'show advanced options',1; 
go 
reconfigure; 
go 
sp_configure 'Ole Automation Procedures', 1; 
go 
reconfigure; 
go 
sp_configure 'show advanced options',0; 
go 
reconfigure; 
go 
+2

BTW, việc tiêu diệt và tái tạo đối tượng regex nhanh hơn nhiều so với bộ nhớ cache và tái sử dụng nó. Chúng tôi đã chạy 10.000 so sánh với số lượng cao hơn đáng kể sử dụng lại đối tượng. –

Các vấn đề liên quan