Регулярные выражения в серверах SQL Server? - PullRequest
17 голосов
/ 06 ноября 2008

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

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

Ответы [ 5 ]

14 голосов
/ 06 ноября 2008

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

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

5 голосов
/ 06 ноября 2008

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

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

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

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

4 голосов
/ 06 ноября 2008

Проверьте это и это . Это отличные посты о том, как это сделать.

1 голос
/ 04 апреля 2009

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

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

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

0 голосов
/ 07 ноября 2008

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

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

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

...