Microsoft SQL Server相当于MySQL REGEXP

时间:2010-03-25 12:06:38

标签: mysql sql-server regex tsql

我正在尝试重建我在Microsoft SQL Server中为MySQL创建的数据库查询。我正在寻找一个运算符或函数SQL Server,其作用类似于REGEXP

以下是我如何使用运算符的示例:

select *
from   musicdetails
WHERE  artistname REGEXP '^".mysql_escape_string($_GET['search'])."$'

3 个答案:

答案 0 :(得分:5)

在这里(编译为SQL CLR程序集):

using System.Collections;
using System.Text.RegularExpressions;
using Microsoft.SqlServer.Server;

public partial class UserDefinedFunctions
{
  [SqlFunction]
  public static bool RegexMatch(string expr, string regex)
  {
    return Regex.IsMatch(expr, regex);
  }

  [SqlFunction]
  public static string RegexReplace(string expr, string regex, string replace)
  {
    return Regex.Replace(expr, regex, replace);
  }

  [SqlFunction(FillRowMethodName="GetToken", 
       TableDefinition="Value nvarchar(max)")]
  public static IEnumerable RegexSplit(string expr, string regex)
  {
    return Regex.Split(expr, regex);
  }

  public static void GetToken(object row, out string str)
  {
     str = (string) row;
  }
}

答案 1 :(得分:1)

在SQL Server(仅限2005及以上版本)中执行此操作的唯一方法是使用CLR函数;作为本机SQL查询的一部分的正则表达式不是标准的。

http://msdn.microsoft.com/en-us/magazine/cc163473.aspx

答案 2 :(得分:0)

虽然leppie的答案中的代码将编译并执行,但我不建议将其用于生产用途。如果您希望RegEx功能:

  • 使用最佳实践(性能和安全性)进行编码
  • 正确处理NULL
  • 表现更好/更有效率
  • 有更多选项(例如@StartAt@RegExOptions IgnoreCase MultiLine 等)
  • 提供更多功能(例如 CaptureGroup CaptureGroupCapture 逃生 Unescape 等)
  • 不需要额外的部署工作(即一个可移植且可版本化的单个自包含T-SQL脚本,并且安装干净,无需手动启用“CLR已启用”或混乱"CLR strict security" setting that was introduced in SQL Server 2017

并且也是免费的,然后查看SQL# SQLCLR库(我写的)。 Free版本中有13个RegEx函数(还有2个Full / paid版本,还有增加表达式缓存大小的功能,如果您经常使用各种表达式,这可能会有所帮助。)

我相信函数 RegEx_IsMatch (或 RegEx_IsMatch4k )正是您所寻找的(是的,它是免费版本)。