Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
+ Предупреждение

Все, что тут написано - используйте на свой страх и риск. Автор ответственности не несет.


+ На кого рассчитано


Для всех, кому надоело писать substring(right(charindex(......)...)...) o_O.

Предполагается знание regex'ов или наличие желания их изучить.



+ Что почитать


Jeffrey E. F. Friedl - Mastering Regular Expressions


Jan Goyvaerts - Regular Expressions Cookbook


При желании все гуглится.


+ Инструменты для отладки


Online:

regex101
regexpal
RegexBuddy



+ Как включить хостинг CLR


Подробности тут

sp_configure 'show advanced options', 1;
go
reconfigure;
go
sp_configure 'clr enabled', 1;
go
reconfigure;
go



+ Настройка поддержки Regex в БД


Просто в контексте нужной базы выполните скрипт из приложения regex_install.sql

То что в скрипте, скомпилено в Release конфигурации под .NET Framework 3.5.
Тестировалось на SQL Server 2014, на остальных тоже должно работать. Под рукой нет проверить.

Также в приложении лежит проект с исходниками. Допиливайте под себя, как хотите.




Нужно распарсить текст и получить данные в виде таблицы? Попробуйте Regex_Matches.

+ ext.Regex_Matches


Поскольку это всего лишь обертка статических методов класса Regex из состава .NET Framework, то актуальна
документация

CREATE FUNCTION [ext].[Regex_Matches]
(
	@input NVARCHAR (MAX), 
	@pattern NVARCHAR (4000), 
	@options NVARCHAR (4000)
)
RETURNS 
	TABLE 
	(
		[match]    INT            NULL,
		[group]    INT            NULL,
		[capture]  INT            NULL,
		[position] INT            NULL,
		[length]   INT            NULL,
		[value]    NVARCHAR (MAX) NULL
	)
AS EXTERNAL NAME [RegexWrapper].[UserDefinedFunctions].[Regex_Matches]
GO


Обертка реализована как table valued function. Параметры по названию и смыслу полностью совпадают с
соответствующим статическим методом .NET Regex.Matches. Возвращает в виде таблицы куски текста @input, которые
удовлетворяют регулярному выражению @pattern.

Как формируется возвращаемая функцией таблица совпадений. Под капотом вызывается статический метод Regex.Matches,
который возвращает коллекцию MatchCollection
эта коллекция сделана "ленивой". Т. е. регулярное выражение применяется не целиком ко всему тексту сразу, а по мере того, как перебираются элементы
этой коллекции. Этот принцип постарался сохранить при возврате строк SQL Server'у (с помощью итераторов), чтобы регулярное выражение применялось к
тексту по мере получения строк из функции (сделано, например для TOP(n), в этом случае регулярное выражение будет применено не более N раз).

Каждый элемент коллекции MatchCollection представляет собой объект класса ]Match,
каждый из которых, в свою очередь, может иметь коллекцию GroupCollection, состоящую из
объектов класса Group, каждый из которых, в свою очередь, может иметь
коллекцию CaptureCollection, состоящую из объектов класса Capture

За смыслом классов Match/Group/Capture обращайтесь к документации по ссылкам выше.

В возвращаемой таблице колонка:
- match соответствует номеру объекта Match в коллекции MatchCollection
- group соответствует номеру объекта Group в коллекции match.Groups
- capture соответствует порядковому номеру объекта capture в коллекции group.Captures
- value найденная подстрока
- position позиция первого символа подстроки value
- length длина подстроки value

Примеры использования:

/*
	Вытащить из текста все, что похоже на email.
*/
declare
	@d1 nvarchar(max) =
	N'
	he38c4 3vcjh3hcn4c8 hbfjf wejhbweyx2b hy&^TVIU G23dy2b3uhs BJJ
		email1@domain1.ru wjechne nx32y38
		djvnsdk
	28cb839&*%*V&^UBJHKLLMv email2@domain2.ru cnhwcy3287ry38r 


	email3@l3.l2.l1.local. 3uiycbr43ury34ius iu3yb
	ferfkje
			oierjg34gh34g
	';

select *
from
	ext.Regex_Matches(@d1, N'\w+@(?:\w+|\.)+\w+', NULL);


matchgroupcapturepositionlengthvalue
1116917email1@domain1.ru
21114017email2@domain2.ru
31118121email3@l3.l2.l1.local


/*
	Вытащить из текста пары param_name = value
*/
declare
	@d2 nvarchar(max) =
	N'
		ubyc237  32423v4 &*(YB&TON(*UPMOKKLe param1 = value1
			fw4g34v34tv34vt34fw wc487ry943r78 w kjf
				ij param2 = value2

			cwoejwioeh fw param3=
			value3 ejfhwekfuiwe82f93
	';

/*
	Для наглядности сначала просто распарсим, чтобы видно было, как
	MatchCollection ложится в таблицу.

	Здесь специально применяются группы (...)(...), чтобы
	увидеть все это в таблице.
	
	group = 1 это весь кусок текста соответствую регулярке
	group = 2 это первая (...) название параметра
	group = 3 это вторая (...) значение параметра
*/
select *
from
	ext.Regex_Matches(@d2, N'(\w+)\s*=\s*(\w+)', NULL);



matchgroupcapturepositionlengthvalue
1114115param1 = value1
121416param1
131506value1
21110915param2 = value2
2211096param2
2311186value2
31114518param3= value3
3211456param3
3311576value3



/*
	Вывернем в строки
*/

with t0 as
(
	select
		[match],
		[group],
		value
	from
		ext.Regex_Matches(@d2, N'(\w+)\s*=\s*(\w+)', NULL)
)
select
	pvt.match,
	pvt.[2] as [param_name],
	pvt.[3] as [param_value]
from
	t0
		pivot
	(max(value) for [group] in ([2], [3])) pvt


matchparam_nameparam_value
1param1value1
2param2value2
3param3value3


24 фев 15, 23:27    [17307786]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
Скрипт заливает сборку (SAFE) и создает ссылки на функции в сборке.

К сообщению приложен файл (regex_install.sql - 56Kb) cкачать
24 фев 15, 23:29    [17307789]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...  [new]
o-o
Guest
спасибо

К сообщению приложен файл. Размер - 181bytes
24 фев 15, 23:29    [17307790]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
Проект с исходниками.

К сообщению приложен файл (RegexWrapper.zip - 8Kb) cкачать
24 фев 15, 23:30    [17307794]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
Позже опишу, как будет время:

ext.Regex_Replace
ext.Regex_Split
ext.Regex_IsMatch

в сборке это все есть, если что, можно разобраться самостоятельно по доке из .NET Framework. Сигнатуры те же. Также опишу для всех функций параметр @options... (или по коду пока гляньте, что туда можно пихать).
24 фев 15, 23:35    [17307803]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31485
churupaha,

Спасибо!
25 фев 15, 00:47    [17307977]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37075
Публиковать ваш материал в виде блога на этом ресурсе не пробовали?
C FAQ пока все сложно.
25 фев 15, 02:07    [17308113]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4311
churupaha, спасибо!
Толково и по существу.
25 фев 15, 09:14    [17308412]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...  [new]
Jovanny
Member

Откуда:
Сообщений: 1195
Извините, не понял, в чём прикол.
Вы сделали обёртку для основных методов из пространства имён System.Text.RegularExpressions ?
И что здесь особенного?
25 фев 15, 09:29    [17308453]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4311
Jovanny
Извините, не понял, в чём прикол.
Вы сделали обёртку для основных методов из пространства имён System.Text.RegularExpressions ?
И что здесь особенного?

Особенного ничего. Но это опубликовано в виде готового решения. Отсюда и FAQ.
Не сомневаюсь, что каждый, кто немного разбирается в теме, при необходимости, может легко это сделать.
НО... это уже сделано. Не нужно искать, читать и разбираться.
Экономит время. За что и спасибо.
25 фев 15, 09:37    [17308484]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...  [new]
Jovanny
Member

Откуда:
Сообщений: 1195
SQL2008,

Я предпочитаю видеть как T-SQL код, так и .Net код, с которым работаю. А чего ТС напихал в свои сборки, неизвестно. Не исключено, что и какой-нибудь вредоносный код.
Так что мой совет - пишите свои CLR сборки. И попутно изучайте какой-нибудь .Net язык, потому что требования к базам данных возрастают с каждым днём и одним Transact-SQL уже не обойтись..
25 фев 15, 09:47    [17308515]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
Хотите разбить текст на куски по разделителю? Попробуйте ext.Regex_Split

+ ext.Regex_Split


Поскольку это всего лишь обертка статических методов класса Regex из состава .NET Framework, то актуальна документация.

CREATE FUNCTION [ext].[Regex_Split]
(
	@input [NVARCHAR](max), 
	@pattern [NVARCHAR](4000), 
	@options [NVARCHAR](4000)
)
RETURNS  
	TABLE 
	(
		[part] [NVARCHAR](max) NULL
	)
AS EXTERNAL NAME [RegexWrapper].[UserDefinedFunctions].[Regex_Split]


Здесь @pattern задает шаблон разделителя. Строка @input бьетсяна куски по разделителю @pattern.

Возвращается таблица строк (кусков, на которые была разбита исходная строка).

/*
	Случай с константным разделителем. Разбить строку по разделителю ','.
*/
declare
	@d nvarchar(max) = N'1,2,3,4,5,6,7,8';

select * from ext.Regex_Split(@d, N',', NULL);


part
1
2
3
4
5
6
7
8


/*
	Случай с переменным разделителем. Разбить строку на числа.
*/
declare
	@d nvarchar(max) = N'1vV%&R^TG2jh32re4c44vc5v54b56y,tyhtyhtyh6,7&*(*#&*TJH7gg8';

select * from ext.Regex_Split(@d, N'[^\d]+', NULL);


part
1
2
32
4
44
5
54
56
6
7
7
8


/*
	Случай с переменным разделителем по некоторому шаблону. Разбить строку на числа.
	Здесь разделителем будет все что задано в виде #XY.ZQ...#, где X, Y, Z, Q... - произвольные цифры
*/
declare
	@d nvarchar(max) = N'erhbfrubfwu23$%^E$E&*&e#11.23333444#EJKRHVEGHREYEHJbjhv76t7^R&#17.918789687#V^%R&%ETFGHFff#57.7867#bfjh';

select * from ext.Regex_Split(@d, N'#\d{2}\.\d{2,}#', NULL);


part
erhbfrubfwu23$%^E$E&*&e
EJKRHVEGHREYEHJbjhv76t7^R&
V^%R&%ETFGHFff
bfjh


25 фев 15, 09:47    [17308516]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
Хотите что-то заменить в строке? Попробуйте ext.Regex_Replace.

+ ext.Regex_Replace

Поскольку это всего лишь обертка статических методов класса Regex из состава .NET Framework, то актуальна документация.

CREATE FUNCTION [ext].[Regex_Replace]
(
	@input [NVARCHAR](max), 
	@pattern [NVARCHAR](4000), 
	@replacement [NVARCHAR](max), 
	@options [NVARCHAR](4000))
RETURNS 
	[nvarchar](max)
AS 
EXTERNAL NAME [RegexWrapper].[UserDefinedFunctions].[Regex_Replace]


Обертка очень простая. Сделана в виде скалярной функции. Ищет в строке @input подстроки,
соответствующие шаблону @pattern и заменяет их на строку @replacement. Причем, в @replacement
есть возможность ссылаться на подстроки в заменяемой строке (пример ниже).

/*
	Попытка вычистить грязную строку под CSV с разделителем ';'
*/
declare
	@d nvarchar(max) = 
	N'
	534,	34^^%&, 35,&% "ООО Рога и копыта",765857
	';

select ext.Regex_Replace(@d, N'[^"\w]*,[^"\w]*', N';', NULL) as res;


res
534;34;35;"ООО Рога и копыта";765857


/*
	Демонстрация возможности ссылок из ЗАМЕНЯЮЩЕЙ строки на куски ЗАМЕНЯЕМОЙ. 
*/
with t0(url) as
(
	select 'http://www.mydomain1.ru/c/pictures/0001.jpg' union all
	select 'ftp://zzz2.ru/d/pictures/test02.png' union all
	select 'hz://www1.www2.mydomain1.ru/e/pictures/pict_0017.jpg'
)
/*
	Специально в шаблоне выделяются группы, на которые будем ссылаться при замене.
	Нумеруются в порядке открывающих скобок. Шаблон выглядит как (..1..)(?:...)(..2..)(..3..),
	та группа что с ?: не учавствует в захвате текста. Соответственно из replacement можно на группы ссылаться
	по $1, $2, $3. Подробнее об этом можно почитать в книжках по regex'ам.
*/
select ext.Regex_Replace(url, N'(\w+)\:\/\/(?:.*?)/(\w)/(.*)', N'Файл: $2:/$3 доступен по протоколу: $1 ', NULL) as res
from
	t0;


res
Файл: c:/pictures/0001.jpg доступен по протоколу: http
Файл: d:/pictures/test02.png доступен по протоколу: ftp
Файл: e:/pictures/pict_0017.jpg доступен по протоколу: hz


25 фев 15, 10:48    [17308762]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...  [new]
Jovanny
Member

Откуда:
Сообщений: 1195
churupaha,

Рекламируете своё произведение?)
25 фев 15, 10:58    [17308832]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...  [new]
o-o
Guest
Jovanny
churupaha,
Рекламируете своё произведение?)

+

кому завидно, может свое выложить.
как будто мало других тем "оцените мой велосипед".
но вот лично мне, чтобы за что-то взяться, надо сперва увидеть, что оно работает.
а когда для того, чтобы увидеть, вернее, еще "до того", надо кучу всего прочесть, руки опускаются.
и как раз с левого ресурса я себе ничего грузить не стану, а кто считает
"чего ТС напихал в свои сборки, неизвестно. Не исключено, что и какой-нибудь вредоносный код"
может и не грузить, и правильно считает, разве же кто против, просто не для вас тема, всего-то.
или уже и спасибо запрещено здесь говорить?
мне, чтобы посмотреть в сторону CLR, нужен был хороший пинок, но меня никак не припирало.
а теперь займусь.

может оно и правда лучше бы выглядело в виде блога,
но пойди догадайся, что еще не работает на этом ресурсе, кроме фака.
одно ясно: в виде темы публиковать можно, вот человек и публикует
25 фев 15, 11:22    [17309005]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Jovanny
А чего ТС напихал в свои сборки, неизвестно. Не исключено, что и какой-нибудь вредоносный код.

Выше дана ссылка на исходники.
Тема называется "FAQ: Regex...". Как и в любом FAQ, тут нет ничего выдающегося, т.к. задача FAQ не в этом, а в том, чтобы быстро найти ответ, на часто задаваемый вопрос или решение популярной проблемы, вместо того, чтобы разбираться самому и попутно мучить других участников форума избитой темой.
Рекламы никакой нет - есть примеры. Если все хорошо протестировано и работает без ошибок - очень полезная тема, по этому, пожалуйста, не засоряйте ее умозрительными комментариями. Если есть желание высказаться, можно сделать конструктивный вклад, например: найти ошибку/неточность/сделать тесты производительности/рассмотреть альтернативные способы решения и т.д. Оформить и выложить как дополнение.
25 фев 15, 11:23    [17309016]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
Хотите проверить удовлетворяет ли строка шаблону? Попробуйте ext.Regex_IsMatch.

+ ext.Regex_IsMatch

Поскольку это всего лишь обертка статических методов класса Regex из состава .NET Framework, то актуальна документация.

CREATE FUNCTION [ext].[Regex_IsMatch]
(
	@input [NVARCHAR](max), 
	@pattern [NVARCHAR](4000), 
	@options [NVARCHAR](4000)
)
RETURNS
	[bit]
AS EXTERNAL NAME [RegexWrapper].[UserDefinedFunctions].[Regex_IsMatch]


Обертка очень простая. Скалярная функция. Если строка @input удовлетворяет шаблону
@pattern, то возвращает 1, иначе 0.

with t0(email) as
(
	select 'e1@d1.ru' union all
	select 'e2_zzz@d3.d2.d1.ru' union all
	select 'e3@d3_dsds_d2.d1.d4.ru' union all
	select '^%R^&RGHJ'
)
select
	email,
	-- Я просто скопипастил упрощенный RFC2822
	ext.Regex_IsMatch(email, '[a-z0-9!#$%&''*+/=?^_''{|}~-]+(?:\.[a-z0-9!#$%&''*+/=?^_''{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?', NULL) as is_valid
from
	t0;


emailis_valid
e1@d1.ru1
e2_zzz@d3.d2.d1.ru1
e3@d3_dsds_d2.d1.d4.ru0
^%R^&RGHJ0


/*
    Regex в check constraint'ах
*/

create table t(id int, email nvarchar(max));
go

alter table t add constraint chk_t_email
check
(
        -- Скопипастил чью-то попытку описать RFC 2822
	1 = ext.Regex_IsMatch(email, N'(?:[a-z0-9!#$%&''*+/=?^_''{|}~-]+(?:\.[a-z0-9!#$%&''*+/=?^_''{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])', N'Singleline')
);
go

insert into t(id, email) values(1, 'myemail@d4.d2.d3.ru');
go
insert into t(id, email) values(1, 'defel2@zzz.ru');
go
insert into t(id, email) values(1, 'не email');
go


вывод

(1 row(s) affected)

(1 row(s) affected)
Msg 547, Level 16, State 0, Line 15
The INSERT statement conflicted with the CHECK constraint "chk_t_email". The conflict occurred in database "zzz1", table "dbo.t", column 'email'.
The statement has been terminated.


25 фев 15, 11:28    [17309049]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
У каждой обертки есть параметр @options. Что туда передавать?

+ Regex_XXX(..., @options)


У всех исходных обернутых функций .NET Framework он тоже есть. Но в .NET это enum с флажками RegexOptions.

В .NET задание опций выглядело бы так:

Regex.Split(..., RegexOptions.IgnoreCase | RegexOptions.Singleline);

При использовании обертки, передавайте в @options строку:

ext.Regex_Split(..., N'IgnoreCase | Singleline | IgnorePatternWhitespace')

допустимо
ext.Regex_Split(..., N'IgnoreCase		| 
Singleline |			IgnorePatternWhitespace')


Если устраивают поведение по умолчанию, передавать можно NULL

25 фев 15, 11:41    [17309133]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
Вроде все. Всем пожалуйста, надеюсь это кому-то сэкономит время (мне сильно экономило).
25 фев 15, 11:51    [17309237]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
Гавриленко Сергей Алексеевич,

я как-то хотел сделать тут блог. подал заявку и глухо. давно было. с FAQ тоже самое.
25 фев 15, 12:00    [17309303]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
Если кто-то заморочится изучением regex'ов, то это не пропадет даром. Это палка выручалка на каждый день. Ее поддерживаеют многие от всяких grep'ов/perl'ов/java и редакторов до некоторых других СУБД, сами знаете каких (прямо из коробки)
25 фев 15, 12:11    [17309364]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
Последние исходники будут доступны на GitHub:

RegexWrapper Repository

Если кто найдет ошибки, правьте и делайте свои commit'ы.
5 мар 15, 19:50    [17349189]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...  [new]
b00ring
Member

Откуда:
Сообщений: 59
churupaha, я правильно понимаю, без компиляции проекта сборку не обновить?

Можно обнаглеть и попросить вас обновить regex_install.sql ?

Спасибо.
21 май 15, 23:12    [17673851]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
Если стоит предыдущая версия, то для обновления использовать этот скрипт

К сообщению приложен файл (regex_update-22.05.2015.sql - 59Kb) cкачать
21 май 15, 23:50    [17673930]     Ответить | Цитировать Сообщить модератору
 Re: FAQ: Regex. Парсим, заменяем, разбиваем, крутим/вертим...  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
Если устанавливать в новую базу, то использовать этот скрипт

К сообщению приложен файл (regex_install-22.05.2015.sql - 59Kb) cкачать
21 май 15, 23:52    [17673934]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить