SQL Server中是否有T-SQL
(无CLR
,无扩展SP
,纯T-SQL
)编写的正则表达式库?
(应与共享主机配合使用)
编辑:
感谢我了解PATINDEX
,LIKE,
xp _ sps
and
CLR`解决方案
我也知道它不是regex
最好的地方,问题是理论上的:)
也接受缩减功能
答案 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一起使用。它具有正则表达式搜索功能,例如grep
和grepl
。
以下是电子邮件地址的示例。我会查询一些&#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
快乐编码