是否可以使用完整的正则表达式功能集进行高效查询。
如果不是微软真的应该考虑这个功能。
答案 0 :(得分:14)
对于SQL Server 2000(以及任何其他32位版本的SQL Server),有xp_pcre,它将Perl兼容的正则表达式作为一组扩展存储过程引入。我用它,它有效。
更新的版本可让您直接访问.NET integrated regular expressions(此链接似乎已死,此处是另一个:MSDN: How to: Work with CLR Database Objects)。
答案 1 :(得分:5)
答案是否定的,不是一般情况下,尽管它可能取决于你的效率。出于这些目的,我将使用以下定义:'以合理的顺序有效地使用索引和连接',这可能与任何一个一样好。
在这种情况下,“高效”查询是's-arg'-able,这意味着他们可以使用索引查找来缩小搜索谓词的范围。平等(t-joins)和简单的不等式可以做到这一点。 'AND'谓词也可以这样做。之后,我们进入表,索引和范围扫描 - 即必须按记录(或索引键)索引键进行比较的操作。
Sontek的回答描述了一种将regexp功能嵌入到查询中的方法,但操作仍然需要逐个记录地进行比较。将其包含在函数中将允许基于函数的索引,其中计算的结果在索引中具体化(Oracle支持这一点,您可以通过使用所讨论的那种技巧在in this article中获得SQL Server中的等效功能) 。但是,您无法为任意正则表达式执行此操作。
在一般情况下,正则表达式的语义不适合以索引的方式修剪匹配集,因此可能无法将rexegp支持集成到查询优化器中。
答案 2 :(得分:4)
答案 3 :(得分:1)
我希望能够在SQL Server中本地调用正则表达式以进行即席查询并在存储过程中使用。我们的DBA不允许我们创建CLR函数,因此我一直在使用LINQ Pad作为一种穷人的查询编辑器来处理特殊事务。在处理已保存到数据库的结构化数据(如JSON或XML)时,它尤其有用。
我同意这似乎是一种疏忽,即没有正则表达式支持,它似乎是查询语言的一个明显特征。希望我们将在未来的版本中看到它,但人们已经要求它很长一段时间了,它还没有进入产品。
我见过的最常见的原因是,一个格式不正确的表达式会导致catastrophic backtracking在.NET中不会中止,几乎总是需要重启机器。也许一旦他们在框架中解决这个问题,我们就会看到它包含在未来版本的SQL Server中。
答案 4 :(得分:0)
我认为我们可以从SQL Server 2008中的新类型(hierarchyid,geo-spatial)看到,如果Microsoft确实添加了它,它将以SQL CLR程序集的形式出现
如果您能够将Assemblies安装到数据库中,则可以通过在Visual Studio中创建新的Database \ SQL Server项目来自行创建 - 这将允许您创建新的Trigger / UDF / Stored Proc / Aggregate或UDT。您可以将System.Text.RegularExpressions导入到类中并从那里开始。
希望这有帮助