2012-01-19 16 views
49

szukam jak wymienić/tekst kodowanie za pomocą wyrażenia regularnego na podstawie wyrażenia regularnego ustawienia/params poniżej:przy użyciu regex w SQL Server

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

Widziałem kilka przykładów RegEx, ale mylić co do sposobu zastosowania to samo w SQL Server. Wszelkie sugestie byłyby pomocne. Dziękuję Ci.

+0

Hi wziąć spójrz na ten artykuł: http://www.codeproject.com/Articles/42764/Regular-Expre ssions-in-MS-SQL-Server-2005-2008 – Mohsen

+0

Istnieje również dobre ** rozwiązanie TSQL ** ** + Windows API ** w [Robyn Page i Phil Factor's] (https: //www.simple-talk. com/sql/t-sql-programming/tsql-regular-expression-workbench /), który opiera się na [VBScript.RegExp] (https://msdn.microsoft.com/en-us/library/ee236360%28v=vs. 84% 29.aspx), która, jak sądzę, jest dostarczana na każdej wersji Windows od Windows 2000. –

+0

Jeśli absolutnie pozytywnie potrzebujesz RegEx za pośrednictwem TSQL, opcja dla SQL Server 2016 i nowszych wersji to [używaj usług R] (https) : //stackoverflow.com/questions/194652/sql-server-regular-expressions-in-t-sql/46536661#46536661). – DMason

Odpowiedz

64

Nie musisz wchodzić w interakcje z kodu zarządzanego, jak można użyć 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 

Jako Twój wyraz kończy + można przejść z '%[^a-z0-9 .][^a-z0-9 .]%'

EDIT: aby clear: SQL Server nie obsługuje wyrażeń regularnych bez kodu zarządzanego. W zależności od sytuacji operatorem może być operator LIKE, ale brak w nim elastyczności wyrażenia regularnego.

+5

@MikeYoung, masz rację. Ta odpowiedź niepoprawnie adresuje kwantyfikator '+ 'jako' {1,2} ', kiedy powinien przyjąć wartość' {1,} '. Co zaskakujące, działało to na PO. –

+1

Nie będzie działać na serwerze sql, ponieważ nie obsługuje regex. – VVN

+5

@VVN, 'LIKE' nie jest regex (jest to bardziej ograniczona składnia pasująca do wzorca), więc brak obsługi regex nie oznacza, że ​​to nie zadziała. –

5

Będziesz musiał zbudować procedurę CLR, która zapewnia funkcjonalność wyrażenia regularnego, jak ilustruje to this article.

+0

Jest to w klasycznej ASP, czy obsługuje? Myślę, że CLR jest tylko dla funkcji .NET, prawda? –

+4

Procedury CLR są instalowane w środowisku programu SQL Server i można je wywoływać, tak jak każdą inną procedurę przechowywaną lub funkcję zdefiniowaną przez użytkownika, więc jeśli klasyczna ASP może wywołać procedurę przechowywaną lub funkcję zdefiniowaną przez użytkownika, może wywołać procedurę CLR. – mwigdahl

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

Albo jakiś inny wyraz zamiast AZ

5

Nieco zmodyfikowana wersja 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 

Musisz Procedury automatyzacji OLE włączona w 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, znacznie szybciej jest zniszczyć i ponownie utworzyć obiekt regex niż cache i użyć go ponownie. Przeprowadziliśmy 10 000 porównań ze znacznie wyższymi liczbami ponownego użycia obiektu. –

Powiązane problemy