Expressions régulières SQL Server dans T-SQL

Existe-t-il une bibliothèque d'expressions régulières écrite en T-SQL (pas de CLR, pas de sp étendu, pure t-sql) pour SQL Server?

(devrait travailler avec l'hébergement partagé)

Modifier:

  • merci je connais PATINDEX, LIKE, xp_ sps et les solutions CLR

  • Je sais aussi que ce n'est pas le meilleur endroit pour regex, la question est théorique 🙂

  • fonctionnalité réduite est également acceptée

Que diriez- vous de la fonction PATINDEX ?

Le model correspondant dans TSQL n'est pas une bibliothèque regex complète, mais il vous donne les bases.

(De la documentation en ligne)

 Wildcard Meaning % Any ssortingng of zero or more characters. _ Any single character. [ ] Any single character within the specified range (for example, [af]) or set (for example, [abcdef]). [^] Any single character not within the specified range (for example, [^a - f]) or set (for example, [^abcdef]). 

Il existe une correspondance de model de base disponible en utilisant LIKE, où% correspond à n'importe quel nombre et combinaison de caractères, _ correspond à un caractère, et [abc] peut correspondre à a, b, ou c … Il y a plus d'informations sur le site MSDN .

Si quelqu'un est intéressé par l'utilisation de regex avec CLR, voici une solution. La fonction ci-dessous (C # .net 4.5) renvoie un 1 si le motif est reconnu et un 0 si le motif n'est pas apparié. Je l'utilise pour marquer les lignes dans les sous-requêtes. L'atsortingbut SQLfunction indique au server SQL que cette méthode est la fonction UDF utilisée par le server SQL. Enregistrez le file en tant que DLL dans un endroit où vous pouvez y accéder depuis le studio de gestion.

 // default using statements above using System.Data.SqlClient; using System.Data.SqlTypes; using Microsoft.SqlServer.Server; using System.Text.RegularExpressions; namespace CLR_Functions { public class myFunctions { [SqlFunction] public static SqlInt16 RegexContain(SqlSsortingng text, SqlSsortingng pattern) { SqlInt16 returnVal = 0; try { ssortingng myText = text.ToSsortingng(); ssortingng myPattern = pattern.ToSsortingng(); MatchCollection mc = Regex.Matches(myText, myPattern); if (mc.Count > 0) { returnVal = 1; } } catch { returnVal = 0; } return returnVal; } } } 

Dans le studio de gestion importer le file dll via la programmabilité – assemblages – nouvel assemblage

Ensuite, exécutez cette requête:

 CREATE FUNCTION RegexContain(@text NVARCHAR(50), @pattern NVARCHAR(50)) RETURNS smallint AS EXTERNAL NAME CLR_Functions.[CLR_Functions.myFunctions].RegexContain 

Ensuite, vous devriez avoir un access complet à la fonction via la database dans laquelle vous avez stocké l'assembly.

Ensuite, utilisez dans les requêtes comme ça:

 SELECT * FROM ( SELECT DailyLog.Date, DailyLog.Researcher, DailyLog.team, DailyLog.field, DailyLog.EntityID, DailyLog.[From], DailyLog.[To], dbo.RegexContain(Researcher, '[\p{L}\s]+') as 'is null values' FROM [DailyOps].[dbo].[DailyLog] ) AS a WHERE a.[is null values] = 0 

Dans le cas où quelqu'un d'autre regarde toujours cette question, http://www.sqlsharp.com/ est un moyen gratuit et facile d'append des fonctions CLR d' expression régulière dans votre database.

Vous pouvez utiliser les fonctions d'expression régulière VBScript à l'aide de OLE Automation. C'est bien mieux que les frais généraux de création et de maintenance d'un assemblage. S'il vous plaît assurez-vous que vous passez par la section des commentaires pour get une meilleure version modifiée de la principale.

http://blogs.msdn.com/b/khen1234/archive/2005/05/11/416392.aspx

 DECLARE @obj INT, @res INT, @match BIT; DECLARE @pattern varchar(255) = '<your regex pattern goes here>'; DECLARE @matchssortingng varchar(8000) = '<ssortingng to search goes here>'; SET @match = 0; -- Create a VB script component object EXEC @res = sp_OACreate 'VBScript.RegExp', @obj OUT; -- Apply/set the pattern to the RegEx object EXEC @res = sp_OASetProperty @obj, 'Pattern', @pattern; -- Set any other settings/properties here EXEC @res = sp_OASetProperty @obj, 'IgnoreCase', 1; -- Call the method 'Test' to find a match EXEC @res = sp_OAMethod @obj, 'Test', @match OUT, @matchssortingng; -- Don't forget to clean-up EXEC @res = sp_OADestroy @obj; 

Si SQL Server blocked access to procedure 'sys.sp_OACreate'... erreur SQL Server blocked access to procedure 'sys.sp_OACreate'... , utilisez sp_reconfigure pour activer les Ole Automation Procedures . (Oui, malheureusement c'est un changement de niveau de server!)

Plus d'informations sur la méthode de Test est disponible ici

Codage heureux

Si vous utilisez SQL Server 2016 ou une version sp_execute_external_script , vous pouvez utiliser sp_execute_external_script avec R. Il dispose de fonctions pour les searchs d'expressions régulières, telles que grep et grepl .

Voici un exemple pour les adresses e-mail. Je vais interroger des "personnes" via le moteur de database SQL Server, transmettre datatables de ces personnes à R, laisser R décider quelles personnes ont des adresses e-mail non valides et renvoyer ce sous-set de personnes à SQL Server. Les "personnes" proviennent de la table [Application].[People] de la database exemple [WideWorldImporters] . Ils sont transmis au moteur R sous la forme d'une image appelée InputDataSet . R utilise la fonction grepl avec l'opérateur "not" (point d'exclamation!) Pour find quelles personnes ont des adresses email qui ne correspondent pas au model de search de string RegEx.

 EXEC sp_execute_external_script @language = N'R', @script = N' RegexWithR <- InputDataSet; OutputDataSet <- RegexWithR[!grepl("([_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[az]{2,4}))", RegexWithR$EmailAddress), ];', @input_data_1 = N'SELECT PersonID, FullName, EmailAddress FROM Application.People' WITH RESULT SETS (([PersonID] INT, [FullName] NVARCHAR(50), [EmailAddress] NVARCHAR(256))) 

Notez que les fonctionnalités appropriées doivent être installées sur l'hôte SQL Server. Pour SQL Server 2016, il s'appelle "SQL Server R Services". Pour SQL Server 2017, il a été renommé "SQL Server Machine Learning Services".

Closing Thoughts L'implémentation de SQL (T-SQL) par Microsoft n'a pas de support natif pour RegEx. Cette solution proposée peut ne pas être plus souhaitable pour le PO que l'utilisation d'une procédure stockée CLR. Mais cela offre un moyen supplémentaire d'aborder le problème.