Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Проблемка с RegexpMatch  [new]
dimon71
Member

Откуда:
Сообщений: 172
Добрый день форумчане!

Создал пользовательскую функцию

CREATE FUNCTION dbo.f_DimonRegexpMatchExecute (@source varchar(8000), @regexp varchar(1000), @ignorecase bit = 0, @numberesult int = 0) RETURNS VARCHAR (8000)

/*
Функция ищет во входном стринге @source, регулярное выражение @regxp и возвращает его
*/
AS
BEGIN

-- Функция ищет во входном стринге @source, регулярное выражение @regxp и возвращает его.
-- @ignorecase - 1 - игнорирует регистр, 0 - регистрозависимый поиск
-- @numberesult - указывает какой по счету результат вернуть. (Если найдено более чем 1 совпадение) 0 - первый результат.

DECLARE @hr integer
DECLARE @objRegExp integer
DECLARE @objMatches integer
DECLARE @objMatch integer
DECLARE @count integer
DECLARE @results VARCHAR (8000)
DECLARE @TMPTXT VARCHAR (1000)

EXEC @hr = sp_OACreate 'VBScript.RegExp', @objRegExp OUTPUT
IF @hr <> 0 BEGIN
SET @results = NULL;
RETURN 'не могу создать объект';
-- RETURN @results
END

EXEC @hr = sp_OASetProperty @objRegExp, 'Pattern', @regexp
IF @hr <> 0 BEGIN

EXEC @hr = sp_OADestroy @objRegExp

SET @results = NULL;
RETURN 'Pattern'
-- RETURN @results
END

EXEC @hr = sp_OASetProperty @objRegExp, 'Global', true
IF @hr <> 0 BEGIN

EXEC @hr = sp_OADestroy @objRegExp

SET @results = NULL;
RETURN 'Global'
-- RETURN @results
END

EXEC @hr = sp_OASetProperty @objRegExp, 'IgnoreCase', @ignorecase
IF @hr <> 0 BEGIN

EXEC @hr = sp_OADestroy @objRegExp

SET @results = NULL;
RETURN 'IgnoreCase'
-- RETURN @results
END

EXEC @hr = sp_OAMethod @objRegExp, 'execute', @objMatches OUTPUT, @source
IF @hr <> 0 BEGIN

EXEC @hr = sp_OADestroy @objRegExp

SET @results = NULL;
RETURN 'execute'
-- RETURN @results
END


SET @TMPTXT = 'item(' + CAST (@numberesult AS VARCHAR (2)) + ').Value';
EXEC @hr= sp_OAGetProperty @objMatches, @TMPTXT, @results OUT

IF @hr <> 0 BEGIN

EXEC @hr = sp_OADestroy @objRegExp

SET @results = NULL;
RETURN 'не найдено значение'
-- RETURN @results
END

EXEC @hr = sp_OADestroy @objRegExp
IF @hr <> 0 BEGIN
SET @results = 0
RETURN @results
END
RETURN @results
END



Так вот. При запуске данной функции в цикле

DECLARE
@COUNT INT;
SET @COUNT = 0;
WHILE (@COUNT < 1000)
BEGIN
print CAST (@COUNT AS VARCHAR (10)) + ' ' + dbo.f_DimonRegexpMatchExecute ('Размер изображения<\d+x\d+><\d+\/\d+> ', '<.*?>\W?$', 1, 0);
SET @COUNT = @COUNT +1;
END

Нормально выдаются только 255 результатов:
252 <\d+x\d+><\d+\/\d+>
253 <\d+x\d+><\d+\/\d+>
254 <\d+x\d+><\d+\/\d+>
255 execute
256 execute
257 execute
Потом функция перестает работать.
Подскажите, в чем может быть проблема?
5 фев 12, 14:40    [12035664]     Ответить | Цитировать Сообщить модератору
 Re: Проблемка с RegexpMatch  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
dimon71
Добрый день форумчане!

Создал пользовательскую функцию

CREATE FUNCTION dbo.f_DimonRegexpMatchExecute (@source varchar(8000), @regexp varchar(1000), @ignorecase bit = 0, @numberesult int = 0) RETURNS VARCHAR (8000)

/*
Функция ищет во входном стринге @source, регулярное выражение @regxp и возвращает его
*/
AS
    BEGIN

-- Функция ищет во входном стринге @source, регулярное выражение @regxp и возвращает его.
-- @ignorecase - 1 - игнорирует регистр, 0 - регистрозависимый поиск
-- @numberesult - указывает какой по счету результат вернуть. (Если найдено более чем 1 совпадение) 0 - первый результат.

        DECLARE @hr integer
        DECLARE @objRegExp integer
        DECLARE @objMatches integer
        DECLARE @objMatch integer
        DECLARE @count integer
        DECLARE @results VARCHAR (8000)
	DECLARE @TMPTXT VARCHAR (1000)

        EXEC @hr = sp_OACreate 'VBScript.RegExp', @objRegExp OUTPUT
        IF @hr <> 0 BEGIN
            SET @results = NULL;
            RETURN 'не могу создать объект';
--            RETURN @results
        END

        EXEC @hr = sp_OASetProperty @objRegExp, 'Pattern', @regexp
        IF @hr <> 0 BEGIN

	    EXEC @hr = sp_OADestroy @objRegExp

            SET @results = NULL;
            RETURN 'Pattern'
--            RETURN @results
        END

        EXEC @hr = sp_OASetProperty @objRegExp, 'Global', true
        IF @hr <> 0 BEGIN

	    EXEC @hr = sp_OADestroy @objRegExp

            SET @results = NULL;
            RETURN 'Global'
--            RETURN @results
        END

        EXEC @hr = sp_OASetProperty @objRegExp, 'IgnoreCase', @ignorecase
        IF @hr <> 0 BEGIN

	    EXEC @hr = sp_OADestroy @objRegExp

            SET @results = NULL;
            RETURN 'IgnoreCase'
--            RETURN @results
        END    

        EXEC @hr = sp_OAMethod @objRegExp, 'execute', @objMatches OUTPUT, @source
        IF @hr <> 0 BEGIN

	    EXEC @hr = sp_OADestroy @objRegExp

            SET @results = NULL;
            RETURN 'execute'
--            RETURN @results
        END


SET @TMPTXT = 'item(' + CAST (@numberesult AS VARCHAR (2)) + ').Value';
EXEC @hr= sp_OAGetProperty @objMatches, @TMPTXT, @results OUT

        IF @hr <> 0 BEGIN

	    EXEC @hr = sp_OADestroy @objRegExp

            SET @results = NULL;
            RETURN 'не найдено значение'
--            RETURN @results
        END

        EXEC @hr = sp_OADestroy @objRegExp
        IF @hr <> 0 BEGIN
            SET @results = 0
            RETURN @results
        END
    RETURN @results
    END



Так вот. При запуске данной функции в цикле

DECLARE
@COUNT INT;
SET @COUNT = 0;
WHILE (@COUNT < 1000)
	BEGIN
	print CAST (@COUNT AS VARCHAR (10)) + ' ' + dbo.f_DimonRegexpMatchExecute ('Размер изображения<\d+x\d+><\d+\/\d+>   ', '<.*?>\W?$', 1, 0);
	SET @COUNT = @COUNT +1;
	END

Нормально выдаются только 255 результатов:
252 <\d+x\d+><\d+\/\d+>
253 <\d+x\d+><\d+\/\d+>
254 <\d+x\d+><\d+\/\d+>
255 execute
256 execute
257 execute

Потом функция перестает работать.
Подскажите, в чем может быть проблема?
5 фев 12, 14:44    [12035680]     Ответить | Цитировать Сообщить модератору
 Re: Проблемка с RegexpMatch  [new]
dimon71
Member

Откуда:
Сообщений: 172
Забыл сказать SQL 2000.
5 фев 12, 14:50    [12035702]     Ответить | Цитировать Сообщить модератору
 Re: Проблемка с RegexpMatch  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Правим говнокод:
CREATE FUNCTION [dbo].[fnRegExp_MatchExecute] (	-- Найденное в @Source регулярное выражение @RegExp, под номером @NumbeResult
	 @Source	VarChar(8000)
	,@RegExp	VarChar(1000)
	,@IgnoreCase	Bit	= 0		-- 1 - игнорирует регистр, 0 - регистрозависимый поиск
	,@NumbeResult	Int	= 0		-- указывает какой по счету результат вернуть. (Если найдено более чем 1 совпадение) 0 - первый результат
) RETURNS VarChar(8000) AS BEGIN
	DECLARE	 @Result	VarChar(8000)
		,@HR		Int
		,@Method	SysName
		,@ErrSrc	VarChar(8000)
		,@ErrDescr	VarChar(8000)
		,@ObjRegExp	Int
		,@ObjMatches	Int

	SET @Method = 'VBScript.RegExp'; EXEC @HR = sys.sp_OACreate @Method, @ObjRegExp OUT;
	IF (@HR != 0)
		SET @ErrDescr = 'Can`t create object VBScript.RegExp';
	ELSE BEGIN
		SET @Method = 'Pattern'		; EXEC @HR = sys.sp_OASetProperty	@ObjRegExp, @Method, @RegExp			;IF (@HR != 0) GOTO Error;
		SET @Method = 'Global'		; EXEC @HR = sys.sp_OASetProperty	@ObjRegExp, @Method, 1				;IF (@HR != 0) GOTO Error;
		SET @Method = 'IgnoreCase'	; EXEC @HR = sys.sp_OASetProperty	@ObjRegExp, @Method, @IgnoreCase		;IF (@HR != 0) GOTO Error;
		SET @Method = 'execute'		; EXEC @HR = sys.sp_OAMethod		@ObjRegExp, @Method, @ObjMatches OUT, @Source	;IF (@HR != 0) GOTO Error;
		SET @Method = 'item(' + Convert(VarChar,@NumbeResult) + ').Value'
						; EXEC @HR = sys.sp_OAGetProperty	@ObjMatches, @Method, @Result OUT		;IF (@HR != 0) GOTO Error;
		-- Destroy @ObjMatches?
		GOTO Destroy;
Error:		EXEC sys.sp_OAGetErrorInfo @ObjRegExp, @ErrSrc OUT, @ErrDescr OUT;
Destroy:	EXEC sys.sp_OADestroy @ObjRegExp;
	END

	IF (@ErrDescr IS NOT NULL) BEGIN
	--	RETURN NULL;
		RETURN 'Error in method ' + @Method + IsNull(' (' + @ErrSrc + ')','') + ':
' + IsNull(@ErrDescr,'NULL - WTF?');
	END ELSE
		RETURN @Result
END
GO
Надеюсь нет банальных ошибок синтаксиса.
5 фев 12, 15:21    [12035810]     Ответить | Цитировать Сообщить модератору
 Re: Проблемка с RegexpMatch  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Тоже писал в одно время через OLE. Разве что по человечески, через TVF, а не только тупые скалярки.
К сожалению скуль оказался глючным в помеси TVF + OLE. Текла память и сессии валились. Естественно ани это фиксить не собираются - OLE старьё CLR кошернее.
Да, написал сие через CLR. Но в те времена CLR подтекал ещё хуже. Спасибомикрософтзаэто.
5 фев 12, 15:32    [12035863]     Ответить | Цитировать Сообщить модератору
 Re: Проблемка с RegexpMatch  [new]
dimon71
Member

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

Спасибо за совет.
Код действительно не мастерский. Я пишу очень редко, по мере необходимости.
Ваш код также работает только 255 раз в цикле.
Нет ли под рукой решения через CLR случайно?
5 фев 12, 15:51    [12035944]     Ответить | Цитировать Сообщить модератору
 Re: Проблемка с RegexpMatch  [new]
Сид
Member

Откуда: Москва
Сообщений: 305
dimon71,

Чтобы работать с CLR, версия MS SQL должна быть не ниже 2005. Остальное можно погуглить, практически везде первый же пример использования CLR - это как раз Regexp_Match. А вот когда мне понадобился Regexp_Replace, пришлось допиливать самому...
5 фев 12, 16:35    [12036047]     Ответить | Цитировать Сообщить модератору
 Re: Проблемка с RegexpMatch  [new]
dimon71
Member

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

А может кто знает, почему функция вызывается нормально именно 255 раз? Уж больно число неслучайное.
Меня то все устраивает в работе VBScript.RegExp, за исключением того, что у меня цикл обработки с большим числом повторений, где эта функция и не работает. Будь все проще, я бы и не знал....
Ну не делать же десяток разных по имени функций и вызывать следующую, если первая дала сбой... Не факт ведь что такая конструкция заработает.
5 фев 12, 17:18    [12036184]     Ответить | Цитировать Сообщить модератору
 Re: Проблемка с RegexpMatch  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6201
Mnior
Да, написал сие через CLR. Но в те времена CLR подтекал ещё хуже. Спасибомикрософтзаэто.

Кстати, а почему они до сих пор так и не сделали поддержку регэкспов на уроне БД, без привлечения всяких OLE/CLR? Есть какие-то фундаментальные причины, по которым это нельзя сделать? Всё-таки обработки текста в прикладной логике базы бывает достаточно много. У того же оракла регэкспы есть со времен версии 10g.
5 фев 12, 19:13    [12036574]     Ответить | Цитировать Сообщить модератору
 Re: Проблемка с RegexpMatch  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
dimon71
А может кто знает, почему функция вызывается нормально именно 255 раз? Уж больно число неслучайно
Уже писал:
Mnior
-- Destroy @ObjMatches?
Возможно мне изменяет память (с XML путаю), но это ограничение на количество "открытых" объектов. Чистить за собой надо.
Не тяжело же проверить:
CREATE FUNCTION [dbo].[fnRegExp_MatchExecute] (	-- Найденное в @Source регулярное выражение @Pattern, под номером @Index
	 @Source	VarChar(8000)
	,@Pattern	VarChar(8000)
	,@IgnoreCase	Bit	= 0		-- 1 - игнорирует регистр, 0 - регистрозависимый поиск
	,@Index		Int	= 0		-- указывает какой по счету результат вернуть. (Если несколько совпадений) 0 - первый результат
) RETURNS VarChar(8000) AS BEGIN
	DECLARE	 @Result	VarChar(8000)
		,@HR		Int
		,@Method	SysName
		,@ErrSrc	VarChar(8000)
		,@ErrDescr	VarChar(8000)
		,@ObjRegExp	Int
		,@ObjMatches	Int

	SET @Method = 'VBScript.RegExp'; EXEC @HR = sys.sp_OACreate @Method, @ObjRegExp OUT;
	IF (@HR != 0)
		SET @ErrDescr = 'Can`t create object VBScript.RegExp';
	ELSE BEGIN
		SET @Method = 'Pattern'		; EXEC @HR = sys.sp_OASetProperty	@ObjRegExp, @Method, @Pattern			;IF (@HR != 0) GOTO Error;
		SET @Method = 'Global'		; EXEC @HR = sys.sp_OASetProperty	@ObjRegExp, @Method, 1				;IF (@HR != 0) GOTO Error;
		SET @Method = 'IgnoreCase'	; EXEC @HR = sys.sp_OASetProperty	@ObjRegExp, @Method, @IgnoreCase		;IF (@HR != 0) GOTO Error;
		SET @Method = 'execute'		; EXEC @HR = sys.sp_OAMethod		@ObjRegExp, @Method, @ObjMatches OUT, @Source	;IF (@HR != 0) GOTO Error;
		SET @Method = 'item(' + Convert(VarChar,@Index) + ').Value'
						; EXEC @HR = sys.sp_OAGetProperty	@ObjMatches, @Method, @Result OUT		;IF (@HR != 0) GOTO Error;
		EXEC sys.sp_OADestroy @ObjMatches;
		GOTO Destroy;
Error:		EXEC sys.sp_OAGetErrorInfo @ObjRegExp, @ErrSrc OUT, @ErrDescr OUT;
Destroy:	EXEC sys.sp_OADestroy @ObjRegExp;
	END

	IF (@ErrDescr IS NOT NULL) BEGIN
	--	RETURN NULL;
		RETURN 'Error in method ' + @Method + IsNull(' (' + @ErrSrc + ')','') + ':
' + IsNull(@ErrDescr,'NULL - WTF?');
	END ELSE
		RETURN @Result
END
GO
В понедельник, если будет время, со своим кодом проверю.
5 фев 12, 20:42    [12036881]     Ответить | Цитировать Сообщить модератору
 Re: Проблемка с RegexpMatch  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Сон Веры Павловны
Кстати, а почему они до сих пор так и не сделали поддержку регэкспов на уроне БД, без привлечения всяких OLE/CLR? Есть какие-то фундаментальные причины, по которым это нельзя сделать? Всё-таки обработки текста в прикладной логике базы бывает достаточно много. У того же оракла регэкспы есть со времен версии 10g.
C точки зрения маркетинга — бесперспективно. © invm
5 фев 12, 20:44    [12036885]     Ответить | Цитировать Сообщить модератору
 Re: Проблемка с RegexpMatch  [new]
dimon71
Member

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

Да, Вы совершенно правы.
EXEC sys.sp_OADestroy @ObjMatches;
Решило проблему.

Кстати нигде про этот момент не пишут, ну а у меня нет опыта...
Еще раз спасибо огромное!!!!!!!

Кстати нашел еще один способ, может кому понадобится - внешняя хранимая процедура.
dll ка записывается в bin сервера, запускается sql скрипт (он создает пользовательские функции), все само настраивается.
Очень удобно.
http://www.codeproject.com/Articles/4733/xp_pcre-Regular-Expressions-in-T-SQL
Единственно чтобы скачать, нужно зарегистрироваться.
5 фев 12, 21:57    [12037200]     Ответить | Цитировать Сообщить модератору
 Re: Проблемка с RegexpMatch  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
dimon71
EXEC sys.sp_OADestroy @ObjMatches;
Решило проблему.
Кстати нигде про этот момент не пишут, ну а у меня нет опыта...
Это из другой оперы. За такое программирование в С-ях расстреливают на месте. Это базовые привычки вырабатываемые в школе.
Вам чертовски повезло, что у скуля стоит сие ограничение.

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

dimon71
Кстати нашел еще один способ, может кому понадобится - внешняя хранимая процедура.
Нет, спасибо, императивное программирование must die. Не дай бог из-за этого вызывать сие в цикле / курсоре, поубэваубы.
6 фев 12, 01:31    [12037842]     Ответить | Цитировать Сообщить модератору
 Re: Проблемка с RegexpMatch  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
+ fnRegExp_Execute
CREATE FUNCTION [dbo].[fnRegExp_Execute] (
	 @String	NVarChar(4000)
	,@Pattern	NVarChar(4000)
	,@IgnoreCase	Bit	= 1
	,@Multiple	Bit	= 1
) RETURNS @Matches TABLE (
	 [Index]	Int		NOT NULL
	,Position	Int		NOT NULL
	,[Length]	Int		NOT NULL
	,[Value]	NVarChar(4000)
	,SubIndex	Int
	,SubValue	NVarChar(4000)
	,UNIQUE ( [Index]
		,SubIndex
	)
	,UNIQUE ( Position
		,SubIndex
	)
) WITH EXECUTE AS OWNER AS BEGIN -- SELECT * FROM dbo.fnRegExp_Execute('A=1;B=2','(.)=(.)',Default,Default)
	DECLARE	 @HR		Int
		,@OLERegExp	Int
		,@OLEMatches	Int		,@OLESubMatches	Int
		,@OLEMatch	Int
		,@Count		Int		,@SubCount	Int
		,@Counter	Int		,@SubCounter	Int
		,@Position	Int
		,@Length	Int
		,@Value		NVarChar(4000)	,@SubValue	NVarChar(4000)
	EXEC @HR = sys.sp_OACreate 'VBScript.RegExp' ,@OLERegExp OUT
	IF (@HR = 0) BEGIN
		EXEC @HR = sys.sp_OASetProperty	@OLERegExp ,'Pattern'	,@Pattern						IF (@HR != 0) GOTO DRExp
		EXEC @HR = sys.sp_OASetProperty	@OLERegExp ,'IgnoreCase',@IgnoreCase						IF (@HR != 0) GOTO DRExp
		EXEC @HR = sys.sp_OASetProperty	@OLERegExp ,'Global'	,@Multiple						IF (@HR != 0) GOTO DRExp
		EXEC @HR = sys.sp_OAMethod	@OLERegExp ,'Execute'	,@OLEMatches	OUT ,@String				IF (@HR != 0) GOTO DRExp
		EXEC @HR = sys.sp_OAGetProperty	@OLEMatches,'Count'	,@Count		OUT					IF (@HR != 0) GOTO DML
		SET @Counter = 0
		WHILE (@Counter < @Count) AND (@HR = 0) BEGIN
			EXEC @HR = sys.sp_OAGetProperty @OLEMatches	,'Item'		,@OLEMatch	OUT, @Counter		IF (@HR != 0) GOTO DML
			EXEC @HR = sys.sp_OAGetProperty @OLEMatch	,'FirstIndex'	,@Position	OUT			IF (@HR != 0) GOTO DMI
			EXEC @HR = sys.sp_OAGetProperty @OLEMatch	,'Length'	,@Length	OUT			IF (@HR != 0) GOTO DMI
			EXEC @HR = sys.sp_OAGetProperty @OLEMatch	,'Value'	,@Value		OUT			IF (@HR != 0) GOTO DMI
			EXEC @HR = sys.sp_OAGetProperty @OLEMatch	,'SubMatches'	,@OLESubMatches	OUT			IF (@HR != 0) GOTO DSM
			EXEC @HR = sys.sp_OAGetProperty @OLESubMatches	,'Count'	,@SubCount	OUT			IF (@HR != 0) GOTO DSM
			IF (@SubCount > 0) BEGIN
				SET @SubCounter = 0
				WHILE (@SubCounter < @SubCount) BEGIN
					EXEC @HR = sys.sp_OAGetProperty @OLESubMatches ,'Item' ,@SubValue OUT, @SubCounter	IF (@HR != 0) GOTO DSM
					INSERT	@Matches([Index] , Position,[Length],[Value], SubIndex  , SubValue)
					VALUES		(@Counter,@Position,@Length ,@Value ,@SubCounter,@SubValue)
					SET @SubCounter = @SubCounter + 1
				END
			END ELSE
				INSERT	@Matches([Index] , Position,[Length],[Value])
				VALUES		(@Counter,@Position,@Length ,@Value )
		DSM:	EXEC sys.sp_OADestroy @OLESubMatches
		DMI:	EXEC sys.sp_OADestroy @OLEMatch
			SET @Counter = @Counter + 1
		END
	DML:	EXEC sys.sp_OADestroy @OLEMatches
	DRExp:	EXEC sys.sp_OADestroy @OLERegExp
	END
	RETURN
END
GO
+ fnRegExp_Replace
CREATE FUNCTION [dbo].[fnRegExp_Replace] (
	 @String	NVarChar(4000)
	,@Pattern	NVarChar(4000)
	,@Replace	NVarChar(4000)
	,@IgnoreCase	Bit	= 1
) RETURNS NVarChar(4000) WITH RETURNS NULL ON NULL INPUT, EXECUTE AS OWNER AS BEGIN -- SELECT dbo.fnRegExp_Replace('123 456 789','(\S+)(\s+)(\S+)','$3$2$1',Default)
	DECLARE	 @HR		Int
		,@OLERegExp	Int
		,@Replaced	NVarChar(4000)
	EXEC @HR = sys.sp_OACreate 'VBScript.RegExp' ,@OLERegExp OUT
	IF (@HR = 0) BEGIN
		EXEC @HR = sys.sp_OASetProperty	@OLERegExp ,'Pattern'	,@Pattern				IF (@HR != 0) GOTO Destroy
		EXEC @HR = sys.sp_OASetProperty	@OLERegExp ,'IgnoreCase',@IgnoreCase				IF (@HR != 0) GOTO Destroy
		EXEC @HR = sys.sp_OAMethod	@OLERegExp ,'Replace'	,@Replaced OUT ,@String, @Replace--	IF (@HR != 0) GOTO Destroy
	Destroy:EXEC sys.sp_OADestroy @OLERegExp
	END
	RETURN	@Replaced
END
GO
+ fnRegExp_Test
CREATE FUNCTION [dbo].[fnRegExp_Test] (
	 @String	NVarChar(4000)
	,@Pattern	NVarChar(4000)
	,@IgnoreCase	Bit	= 1
) RETURNS Bit WITH RETURNS NULL ON NULL INPUT, EXECUTE AS OWNER AS BEGIN -- SELECT dbo.fnRegExp_Test('12345','3',Default)
	DECLARE	 @HR		Int
		,@OLERegExp	Int
		,@Match		Bit
	EXEC @HR = sys.sp_OACreate 'VBScript.RegExp' ,@OLERegExp OUT
	IF (@HR = 0) BEGIN
		EXEC @HR = sys.sp_OASetProperty	@OLERegExp ,'Pattern'	,@Pattern		IF (@HR != 0) GOTO Destroy
		EXEC @HR = sys.sp_OASetProperty	@OLERegExp ,'IgnoreCase',@IgnoreCase		IF (@HR != 0) GOTO Destroy
		EXEC @HR = sys.sp_OAMethod	@OLERegExp ,'Test'	,@Match OUT ,@String--	IF (@HR != 0) GOTO Destroy
	Destroy:EXEC sys.sp_OADestroy @OLERegExp
	END
	RETURN	@Match
END
GO
В принципе в проверке IF (@HR != 0) нет особого смысла в функциях. Разве что повесить 1/0, для вываливания в ошибку.
	IF (@HR != 0) SET @HR = 1/0
6 фев 12, 12:48    [12039539]     Ответить | Цитировать Сообщить модератору
 Re: Проблемка с RegexpMatch  [new]
Crimean
Member

Откуда:
Сообщений: 13147
ODS API или внешние DLL - отличный выход. был. сейчас имеет право только если нестандартные задачи - переменное число параметров и больше никак. ибо дорого по накладным расходам стало.
6 фев 12, 13:17    [12039874]     Ответить | Цитировать Сообщить модератору
 Re: Проблемка с RegexpMatch  [new]
dimon71
Member

Откуда:
Сообщений: 172
Mnior,
Теперь все вопросы развеяны окончательно. Великолепная коллекция функций!!! Единственно чего не хватает, так это выдача конкретного результата из коллекции результатов. Не всегда же таблица на выходе оправдана.
А так все охвачено.
6 фев 12, 23:30    [12044157]     Ответить | Цитировать Сообщить модератору
 Re: Проблемка с RegexpMatch  [new]
dimon71
Member

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

Сглупил я, Вы же такую функцию первой и сделали.
Пардон.
7 фев 12, 00:06    [12044271]     Ответить | Цитировать Сообщить модератору
 Re: Проблемка с RegexpMatch  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
dimon71
выдача конкретного результата из коллекции результатов. Не всегда же таблица на выходе оправдана.
Да. Но по большей части редкость, хватает правильный патерн указать (в котором первым результатом и будет + Multiple = 0).
Остальные варианты использования аля обход по циклу от лукавого.

А вообще для скуля лучше Like (Test) ограничиваться. Парсирование данных не для БД, лучше на клиент/сервер-апликешн/стороннюю тулзу перекинуть.

А названия кажись из оракакла позаимствовал.
7 фев 12, 00:37    [12044346]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить