18

是否可以使用完整的正则表达式功能集进行高效查询。

如果不是微软真的应该考虑这个功能。

4

5 回答 5

15

对于 SQL Server 2000(和任何其他 32 位版本的 SQL Server),有xp_pcre,它将与 Perl 兼容的正则表达式作为一组扩展存储过程引入。我用过,效果很好。

较新的版本使您可以直接访问.NET 集成的正则表达式(此链接似乎已失效,这是另一个链接:MSDN:如何:使用 CLR 数据库对象)。

于 2008-11-06T08:25:31.450 回答
5

答案是否定的,不是在一般情况下,尽管它可能取决于您所说的高效。出于这些目的,我将使用以下定义:“有效地使用索引并以合理的顺序连接”,这可能与任何定义一样好。

在这种情况下,“高效”查询是“s-arg”-able,这意味着它们可以使用索引查找来缩小搜索谓词。等式(t-join)和简单的不等式可以做到这一点。'AND' 谓词也可以做到这一点。之后,我们进入表、索引和范围扫描——即必须进行逐条记录(或索引键逐索引键)比较的操作。

Sontek 的回答描述了一种将正则表达式功能内联到查询中的方法,但操作仍然必须逐个记录地进行比较。将它包装在一个函数中将允许一个基于函数的索引,其中计算的结果在索引中具体化(Oracle 支持这一点,您可以使用本文中讨论的技巧在 SQL Server 中获得等效的功能)。但是,您不能对任意正则表达式执行此操作。

在一般情况下,正则表达式的语义不适合像索引那样修剪匹配集,因此将 rexegp 支持集成到查询优化器中可能是不可能的。

于 2008-11-06T15:32:59.653 回答
4

看看这个这个。他们是关于如何做到这一点的好帖子。

于 2008-11-06T08:22:08.210 回答
1

我希望能够在 SQL Server 中本地调用正则表达式以进行即席查询并在存储过程中使用。我们的 DBA 不允许我们创建 CLR 函数,所以我一直使用LINQ Pad作为一种穷人的查询编辑器来处理临时的东西。在处理已保存到数据库的 JSON 或 XML 等结构化数据时,它特别有用。

而且我同意没有正则表达式支持似乎是一种疏忽,这似乎是查询语言的一个明显特征。希望我们会在未来的版本中看到它,但人们已经要求它很长时间了,但它还没有进入产品。

我看到的反对它的最常见原因是,格式不正确的表达式会导致灾难性的回溯,这在 .NET 中不会中止,并且几乎总是需要重新启动机器。也许一旦他们在框架中解决了这个问题,我们就会看到它包含在 SQL Server 的未来版本中。

于 2009-04-04T12:27:48.117 回答
0

我想我们可以从 SQL Server 2008 中的新类型(层次结构、地理空间)中看到,如果微软确实添加了这个,它将以 SQL CLR 程序集的形式出现

如果您能够将程序集安装到您的数据库中,您可以通过在 Visual Studio 中创建一个新的 Database\SQL Server 项目来创建您自己的程序 - 这将允许您创建一个新的 Trigger / UDF / Stored Proc / Aggregate 或 UDT。您可以将 System.Text.RegularExpressions 导入类并从那里开始。

希望这可以帮助

于 2008-11-07T01:34:59.187 回答