T-SQL中的SQL Server正则表达式

时间:2008-10-11 21:10:18

标签: sql-server regex tsql

SQL Server中是否有T-SQL(无CLR,无扩展SP,纯T-SQL)编写的正则表达式库?

(应与共享主机配合使用)

编辑:

  • 感谢我了解PATINDEXLIKE, xp _ sps and CLR`解决方案

  • 我也知道它不是regex最好的地方,问题是理论上的:)

  • 也接受缩减功能

6 个答案:

答案 0 :(得分:76)

PATINDEX功能怎么样?

SQL中的模式匹配不是一个完整的正则表达式库,但它为您提供了基础知识。

(来自联机丛书)

Wildcard  Meaning  
% Any string of zero or more characters.

_ Any single character.

[ ] Any single character within the specified range 
    (for example, [a-f]) or set (for example, [abcdef]).

[^] Any single character not within the specified range 
    (for example, [^a - f]) or set (for example, [^abcdef]).

答案 1 :(得分:15)

如果有人对使用CLR使用正则表达式感兴趣,这是一个解决方案。如果模式匹配,则下面的函数(C#.net 4.5)返回1,如果模式不匹配则返回0。我用它来标记子查询中的行。 SQLfunction属性告诉sql server此方法是SQL服务器将使用的实际UDF。将文件另存为dll,您可以从管理工作室访问该文件。

// 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(SqlString text, SqlString pattern)
        {            
            SqlInt16 returnVal = 0;
            try
            {
                string myText = text.ToString();
                string myPattern = pattern.ToString();
                MatchCollection mc = Regex.Matches(myText, myPattern);
                if (mc.Count > 0)
                {
                    returnVal = 1;
                }
            }
            catch
            {
                returnVal = 0;
            }

            return returnVal;
        }
    }
}

在管理工作室中,通过可编程性 - 程序集 - 新程序集

导入dll文件

然后运行此查询:

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

然后,您应该通过存储程序集的数据库完全访问该函数。

然后在如下的查询中使用:

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

答案 2 :(得分:14)

通过使用LIKE可以获得一些基本的模式匹配,其中%匹配任何数字和字符组合,_匹配任何一个字符,[abc]可以匹配a,b或c ... MSDN site上有更多信息。

答案 3 :(得分:4)

如果其他人仍在查看此问题,http://www.sqlsharp.com/是一种免费的简单方法,可将正则表达式 CLR函数 添加到您的数据库中。< / p>

答案 4 :(得分:3)

如果您使用的是SQL Server 2016或更高版本,则可以将sp_execute_external_script与R一起使用。它具有正则表达式搜索功能,例如grepgrepl

以下是电子邮件地址的示例。我会查询一些&#34; people&#34;通过SQL Server数据库引擎,将这些人的数据传递给R,让R决定哪些人拥有无效的电子邮件地址,并让R将该子集传回给SQL Server。 &#34;人民&#34;来自[Application].[People]示例数据库中的[WideWorldImporters]表。它们作为名为InputDataSet的数据帧传递给R引擎。 R使用grepl函数和&#34; not&#34;运营商(感叹号!),以查找哪些人的电子邮件地址与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-]+)*(\\.[a-z]{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)))

请注意,必须在SQL Server主机上安装相应的功能。对于SQL Server 2016,它被称为&#34; SQL Server R服务&#34;。对于SQL Server 2017,它已重命名为&#34; SQL Server机器学习服务&#34;。

结束思考 Microsoft的SQL(T-SQL)实现并没有对RegEx的本机支持。与使用CLR存储过程相比,OP所提出的解决方案可能不再是所希望的。但它确实提供了另一种解决问题的方法。

答案 5 :(得分:0)

您可以使用OLE自动化使用VBScript正则表达式功能。这比创建和维护程序集的开销要好。请确保您浏览评论部分以获得更好的主要修改版本。

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 @matchstring varchar(8000) = '<string 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, @matchstring;

-- Don't forget to clean-up
EXEC @res = sp_OADestroy @obj;

如果您收到SQL Server blocked access to procedure 'sys.sp_OACreate'...错误,请使用sp_reconfigure启用Ole Automation Procedures。 (是的,不幸的是,这是服务器级别的变化!)

有关Test方法的更多信息,请访问here

快乐编码