Wyrażenia regularne w serwerach SQL Server?

Czy możliwe jest tworzenie efektywnych zapytań, które używają pełnego zestawu funkcji wyrażenia regularnego.

Jeśli Nie Microsoft naprawdę powinien rozważyć tę funkcję.

Author: John Saunders, 2008-11-06

5 answers

Dla SQL Server 2000 (i każdej innej 32-bitowej edycji SQL Server) istnieje xp_pcre , która wprowadza wyrażenia regularne zgodne z Perlem jako zestaw rozszerzonych procedur składowanych. Użyłem go, działa.

Nowsze wersje dają bezpośredni dostęp do . NET zintegrowanych wyrażeń regularnych (ten link wydaje się martwy, oto kolejny: MSDN: How to: Work with clr Database Objects ).

 14
Author: Tomalak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-11 17:35:45

Odpowiedź brzmi Nie, Nie w ogólnym przypadku, chociaż może zależeć od tego, co masz na myśli przez efektywne. W tym celu użyję następującej definicji: "efektywnie wykorzystuje indeksy i łączy w rozsądnej kolejności", która jest prawdopodobnie tak dobra, jak każda inna.

W tym przypadku zapytania 'efektywne' są 's-arg'-able, co oznacza, że mogą używać wyszukiwarek indeksowych do zawężania predykatów wyszukiwania. Mogą tego dokonać równania (t-zespolenia) i proste nierówności. Predykaty 'i' również mogą to zrobić. Następnie przechodzimy do skanowania tabel, indeksów i zakresów - czyli operacji, które wymagają porównań rekord po rekordzie (lub indeks-klucz-klucz).

Odpowiedź Sontka opisuje metodę wbudowywania funkcji regexp w Zapytanie, ale operacje nadal muszą wykonywać porównania rekord po rekordzie. Owinięcie go w funkcję umożliwiłoby indeks oparty na funkcji, w którym wynik obliczeń jest materializowany w indeksie (Oracle obsługuje to i można uzyskać równoważny funkcjonalność w SQL Server za pomocą rodzajów sztuczek omówionych w tym artykule ). Jednak nie można tego zrobić dla arbitralnego wyrażenia regularnego.

W ogólnym przypadku semantyka wyrażenia regularnego nie nadaje się do przycinania zestawów dopasowań w taki sposób, jak robi to indeks, więc włączenie obsługi rexegp do optymalizatora zapytań prawdopodobnie nie jest możliwe.

 5
Author: ConcernedOfTunbridgeWells,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-06 15:32:59

Zobacz to ito . Są to świetne posty na temat tego, jak to zrobić.

 4
Author: sontek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-06 08:22:08

Chciałbym mieć możliwość natywnego wywoływania wyrażeń regularnych w SQL Server dla zapytań ad hoc i wykorzystania w procedurach składowanych. Nasz DBA nie pozwala nam tworzyć funkcji CLR, więc używałem LINQ Pad jako rodzaj edytora zapytań dla ad hoc. Jest to szczególnie przydatne podczas pracy z danymi strukturalnymi, takimi jak JSON lub XML, które zostały zapisane w bazie danych.

I zgadzam się, że wydaje się niedopatrzeniem, że nie ma wyrażenia regularnego wsparcie, wydaje się oczywistą cechą języka zapytań. Mam nadzieję, że zobaczymy go w przyszłej wersji, ale ludzie prosili o niego od dłuższego czasu i jeszcze nie wszedł do produktu.

Najczęstszym powodem, dla którego widziałem przeciwko temu, jest to, że źle uformowane wyrażenie może spowodowaćkatastrofalne cofanie , które w.Net nie zostanie przerwane i prawie zawsze wymaga ponownego uruchomienia maszyny. Może jak już się tym zajmą to w ramach zobaczymy zawarte w przyszłej wersji SQL Server.

 1
Author: Junx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-04 12:27:48

Myślę, że możemy zobaczyć z nowych typów w SQL Server 2008 (hierarchyid, geo-spatial), że jeśli Microsoft doda to będzie w formie SQL CLR Assembly

Jeśli jesteś w stanie zainstalować Assembly w swojej bazie danych, możesz stworzyć własny projekt Database\SQL Server w Visual Studio - pozwoli to na utworzenie nowego Trigger / UDF / Stored Proc / Aggregate lub UDT. Możesz zaimportować System.Tekst.Regularnexpresje do klasy i przejść z tam.

Hope this helps

 0
Author: James Green,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-07 01:34:59