Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

Отметьте this и this. Это отличные сообщения о том, как это сделать.

Ответ 4

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

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

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

Ответ 5

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

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

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