Регулярные выражения на серверах SQL Server?

Можно ли создавать эффективные запросы, использующие полный набор функций регулярных выражений.

Если нет, Microsoft действительно должна рассмотреть эту функцию.


person bovium    schedule 06.11.2008    source источник


Ответы (5)


Для SQL Server 2000 (и любой другой 32-разрядной версии SQL Server) существует xp_pcre, который представляет Perl-совместимые регулярные выражения как набор расширенных хранимых процедур. Я использовал его, он работает.

Более поздние версии предоставляют вам прямой доступ к интегрированным регулярным выражениям .NET (эта ссылка кажется мертвой, вот еще одна: MSDN: Практическое руководство. Работа с объектами базы данных CLR).

person Tomalak    schedule 06.11.2008

Ответ — нет, не в общем случае, хотя это может зависеть от того, что вы подразумеваете под эффективностью. Для этих целей я буду использовать следующее определение: «Эффективно использует индексы и соединения в разумном порядке», которое, вероятно, не хуже любого другого.

В этом случае «эффективные» запросы поддерживают «s-arg», что означает, что они могут использовать поиск по индексу для сужения поисковых предикатов. Это могут сделать равенства (t-соединения) и простые неравенства. Предикаты 'И' также могут это делать. После этого мы переходим к сканированию таблиц, индексов и диапазонов — т. е. к операциям, которые должны выполнять сравнения «запись за записью» (или «ключ индекса за ключом индекса»).

Ответ Sontek описывает метод встраивания функций регулярных выражений в запрос, но операции по-прежнему должны выполнять сравнения на основе записи за записью. Оборачивая его в функцию, можно получить основанный на функции индекс, в котором результат вычислений материализуется в индексе (Oracle поддерживает это, и вы можете получить эквивалентную функциональность в SQL Server, используя приемы, которые обсуждались в этой статье). Однако вы не можете сделать это для произвольного регулярного выражения.

В общем случае семантика регулярного выражения не поддается сокращению наборов совпадений, как это делает индекс, поэтому интеграция поддержки rexegp в оптимизатор запросов, вероятно, невозможна.

person ConcernedOfTunbridgeWells    schedule 06.11.2008

Ознакомьтесь с этим и это. Это отличные посты о том, как это сделать.

person sontek    schedule 06.11.2008

Мне бы хотелось иметь возможность вызывать регулярные выражения в SQL Server для специальных запросов и использовать их в хранимых процедурах. Наши администраторы баз данных не позволяют нам создавать функции CLR, поэтому я использовал LINQ Pad как своего рода плохой редактор запросов человека для специальных вещей. Это особенно полезно при работе со структурированными данными, такими как JSON или XML, которые были сохранены в базе данных.

И я согласен, что отсутствие поддержки регулярных выражений кажется недосмотром, это кажется очевидной особенностью языка запросов. Надеюсь, мы увидим это в будущей версии, но люди просили об этом в течение долгого времени, и это еще не вошло в продукт.

Наиболее частая причина, по которой я встречался против этого, заключается в том, что плохо сформированное выражение может вызвать катастрофический поиск с возвратом который в .NET не прерывается и почти всегда требует перезапуска машины. Возможно, как только они решат эту проблему в структуре, мы увидим ее включенной в будущую версию SQL Server.

person Junx    schedule 04.04.2009
comment
Это домыслы и комментарии, а не ответ. - person amoss; 02.12.2011

Я думаю, мы можем видеть из новых типов в SQL Server 2008 (hierarchyid, geo-spatial), что, если Microsoft действительно добавит это, он появится в форме сборки SQL CLR.

Если вы можете установить сборки в свою базу данных, вы можете создать свой собственный, создав новый проект Database\SQL Server в Visual Studio — это позволит вам создать новый Trigger/UDF/Stored Proc/Aggregate или UDT. Вы можете импортировать System.Text.RegularExpressions в класс и перейти оттуда.

Надеюсь это поможет

person James Green    schedule 07.11.2008