2012-01-19 32 views
49

estoy buscando la forma de sustituir el texto/codificar utilizando expresiones regulares en base a la configuración de RegEx/params siguientes:El uso de expresiones regulares en SQL Server

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

que he visto algunos ejemplos de expresiones regulares, pero confundido en cuanto a cómo aplicar de la misma manera en SQL Server. Cualquier sugerencia sería útil. Gracias.

+0

Hola tomar un vistazo a este artículo: http://www.codeproject.com/Articles/42764/Regular-Expre ssions-in-MS-SQL-Server-2005-2008 – Mohsen

+0

También hay una buena solución ** TSQL ** ** + Windows API ** en [Robyn Page y Phil Factor's] (https: //www.simple-talk. com/sql/t-sql-programming/tsql-regular-expression-workbench /) que se basa en [VBScript.RegExp] (https://msdn.microsoft.com/en-us/library/ee236360%28v=vs. 84% 29.aspx) clase, que, en mi opinión, se envía en cada versión de Windows desde Windows 2000. –

+0

Si absolutamente necesita RegEx vía TSQL, una opción para SQL Server 2016 y superior es [usar servicios R] (https : //stackoverflow.com/questions/194652/sql-server-regular-expressions-in-t-sql/46536661#46536661). – DMason

Respuesta

64

No es necesario para interactuar con el código administrado, como se puede utilizar 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 

medida que su expresión termina con + se puede ir con '%[^a-z0-9 .][^a-z0-9 .]%'

EDITAR: hacer clear: SQL Server no admite expresiones regulares sin código administrado. Dependiendo de la situación, el operador LIKE puede ser una opción, pero carece de la flexibilidad que proporcionan las expresiones regulares.

+5

@MikeYoung, tienes razón. Esta respuesta aborda incorrectamente el cuantificador '+' como '{1,2}' cuando debería tomarlo como '{1,}'. Sorprendentemente, esto funcionó para el OP. –

+1

Esto no funciona en el servidor sql ya que no es compatible con regex. – VVN

+5

@VVN, 'LIKE' no es regex (es una sintaxis de coincidencia de patrones más limitada), por lo que la falta de compatibilidad con expresiones regulares no significa que esto no funcione. –

5

Deberá crear un procedimiento CLR que proporcione la funcionalidad regex, como lo ilustra this article.

+0

Esto es en ASP clásico, ¿es compatible? Creo que CLR es solo para funciones .NET, ¿verdad? –

+4

Los procedimientos CLR se instalan en el entorno SQL Server y se pueden invocar como cualquier otro procedimiento almacenado o función definida por el usuario, por lo que si Classic ASP puede invocar un procedimiento almacenado o una función definida por el usuario, puede invocar un procedimiento CLR. – mwigdahl

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

o alguna otra expresión en lugar de AZ

5

versión ligeramente modificada de 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 

Tendrá Procedimientos de automatización OLE activada en 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

Por cierto, es mucho más rápido destruir y recrear el objeto regex que almacenarlo en caché y reutilizarlo. Ejecutamos 10.000 comparaciones con números significativamente más altos reutilizando el objeto. –

Cuestiones relacionadas