Sql server T-SQL中的SQL Server正则表达式
SQL Server是否有任何用T-SQL编写的正则表达式库(没有CLR,没有扩展的Sql server T-SQL中的SQL Server正则表达式,sql-server,regex,tsql,Sql Server,Regex,Tsql,SQL Server是否有任何用T-SQL编写的正则表达式库(没有CLR,没有扩展的SP,没有纯T-SQL),并且可以与共享主机一起使用 编辑: 谢谢,我了解PATINDEX,如,xp\ucode>sps和CLR解决方案 我也知道这不是regex的最佳去处,问题是理论上的:) 减少功能也是可以接受的 使用LIKE可以进行一些基本模式匹配,其中%匹配任意数量和字符组合,uu匹配任意一个字符,[abc]可以匹配a、b或c。。。 有更多关于的信息。功能如何 TSQL中的模式匹配不是一个完整的正则表达
SP
,没有纯T-SQL),并且可以与共享主机一起使用
编辑:
- 谢谢,我了解
,PATINDEX
如
,
xp\ucode>
和CLR解决方案sps
- 我也知道这不是regex的最佳去处,问题是理论上的:)
- 减少功能也是可以接受的
- 使用LIKE可以进行一些基本模式匹配,其中%匹配任意数量和字符组合,uu匹配任意一个字符,[abc]可以匹配a、b或c。。。
有更多关于的信息。功能如何
TSQL中的模式匹配不是一个完整的正则表达式库,但它为您提供了基础知识
(摘自在线图书)
可以使用OLE自动化使用VBScript正则表达式功能。这比创建和维护程序集的开销要好得多。请确保您通过“评论”部分获得主版本的更好修改版本
声明@obj INT、@res INT、@match BIT;
声明@pattern varchar(255)='';
声明@matchstring varchar(8000)='';
设置@match=0;
--创建一个VB脚本组件对象
EXEC@res=sp_OACreate'VBScript.RegExp',@obj OUT;
--将模式应用/设置到RegEx对象
EXEC@res=sp_OASetProperty@obj,'Pattern',@Pattern;
--在此处设置任何其他设置/属性
EXEC@res=sp_OASetProperty@obj,'IgnoreCase',1;
--调用方法“Test”以查找匹配项
EXEC@res=sp_OAMethod@obj,'Test',@match OUT,@matchstring;
--别忘了打扫卫生
EXEC@res=sp_OADestroy@obj;
如果SQL Server阻止了对“sys.sp\u OACreate”过程的访问……错误,请使用sp\u reconfigure
启用Ole自动化过程。(是的,很遗憾,这是服务器级别的更改!)
有关测试方法的更多信息,请参见
快乐编码如果其他人还在看这个问题,这是一种将正则表达式CLR函数添加到数据库中的免费、简单的方法。如果有人对将正则表达式与CLR一起使用感兴趣,这里有一个解决方案。下面的函数(C#.net 4.5)在模式匹配时返回1,在模式不匹配时返回0。我使用它来标记子查询中的行。SQLfunction属性告诉SQLServer此方法是SQLServer将使用的实际UDF。将文件另存为dll,保存在可以从management studio访问该文件的位置
//默认使用上述语句
使用System.Data.SqlClient;
使用System.Data.SqlTypes;
使用Microsoft.SqlServer.Server;
使用System.Text.RegularExpressions;
名称空间CLR_函数
{
公共类函数
{
[SqlFunction]
公共静态SqlInt16 RegexContain(SqlString文本,SqlString模式)
{
SqlInt16 returnVal=0;
尝试
{
字符串myText=text.ToString();
字符串myPattern=pattern.ToString();
MatchCollection mc=Regex.Matches(myText,myPattern);
如果(mc.Count>0)
{
returnVal=1;
}
}
抓住
{
returnVal=0;
}
返回值;
}
}
}
在ManagementStudio中,通过可编程性--程序集--新程序集导入dll文件
然后运行此查询:
创建函数RegexContain(@text-NVARCHAR(50),@pattern-NVARCHAR(50))
返回smallint
作为
外部名称CLR\U函数。[CLR\U函数.myFunctions].RegexContain
然后,您应该可以通过存储程序集的数据库完全访问该函数
然后在如下查询中使用:
选择*
从…起
(
挑选
DailyLog.日期,
DailyLog,研究员,
DailyLog.team,
DailyLog.field,
DailyLog.EntityID,
每日日志[来自],
每日日志[至],
dbo.RegexContain(研究者,[\p{L}\s]+')作为“为空值”
来自[DailyOps].[dbo].[DailyLog]
)作为一个
其中,[为空值]=0
如果您使用的是SQL Server 2016或更高版本,则可以将sp\u execute\u external\u script
与R一起使用。它具有正则表达式搜索功能,例如grep
和grepl
下面是一个电子邮件地址的示例。我将通过SQL Server数据库引擎查询一些“人”,将这些人的数据传递给R,让R决定哪些人的电子邮件地址无效,并让R将该子集传递回SQL Server。“人员”来自[WideWorldImporters]
示例数据库中的[Application].[people]
表。它们作为名为InputDataSet
的数据帧传递到R引擎。R使用grepl函数和“not”操作符(感叹号!)查找哪些人的电子邮件地址与正则表达式字符串搜索模式不匹配
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)))
EXEC sp\u execute\u外部脚本
@语言=N'R',
@我也有这个问题。我知道数据库不是最好的地方,但现实是其他解决方案需要SQL管理员权限才能重新配置服务器。不幸的是,我们的一些客户不会选择启用CLR等,而我们只使用数据库解决方案。@PaulDraper和xnagyg:为什么要排除SQLCLR?它是在查询中获取正则表达式的最合适的方法。为什么您的一些客户会选择不启用CLR?我还没有找到一个合理的理由。当然,我听到了“安全性”和“性能”,但这些都是虚假的原因,这是因为不了解SQLCLR如何工作以及如何限制它。@srutzky:大多数共享主机提供程序不允许CLR。你应该问他们关于“安全”和“p”
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;
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)))