Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server T-SQL中的SQL Server正则表达式_Sql Server_Regex_Tsql - Fatal编程技术网

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

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中的模式匹配不是一个完整的正则表达

SQL Server是否有任何用T-SQL编写的正则表达式库(没有CLR,没有扩展的
SP
,没有纯T-SQL),并且可以与共享主机一起使用

编辑:

  • 谢谢,我了解
    PATINDEX
    xp\ucode>
    sps
    和CLR解决方案
  • 我也知道这不是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)))