Функция SQL Regex, похожая на функцию MySql REGEX - PullRequest
2 голосов
/ 08 июня 2009

Я ищу функцию, которая могла бы делать то же самое, что и функция MySQL REGEX для TSQL. По сути, мне нужно, чтобы мой запрос выглядел примерно так:

SELECT * FROM Routing WHERE (@Message REGEX RouteRegex);

В данный момент мне не хочется использовать CLR.

Есть идеи?

Ответы [ 4 ]

1 голос
/ 08 июня 2009

LFSR прав насчет CLR. Перейти на CLR, но функция ниже также отлично работает. Я тестировал код, пока LFSR опубликовал ответ выше.

CREATE FUNCTION dbo.find_regular_expression
(
    @source varchar(5000),
    @regexp varchar(1000),
    @ignorecase bit = 0
)
RETURNS bit
AS
BEGIN
    DECLARE @hr integer
    DECLARE @objRegExp integer
    DECLARE @objMatches integer
    DECLARE @objMatch integer
    DECLARE @count integer
    DECLARE @results bit

    EXEC @hr = sp_OACreate 'VBScript.RegExp', @objRegExp OUTPUT
    IF @hr <> 0 BEGIN
        SET @results = 0
        RETURN @results
    END
    EXEC @hr = sp_OASetProperty @objRegExp, 'Pattern', @regexp
    IF @hr <> 0 BEGIN
        SET @results = 0
        RETURN @results
    END
    EXEC @hr = sp_OASetProperty @objRegExp, 'Global', false
    IF @hr <> 0 BEGIN
        SET @results = 0
        RETURN @results
    END
    EXEC @hr = sp_OASetProperty @objRegExp, 'IgnoreCase', @ignorecase
    IF @hr <> 0 BEGIN
        SET @results = 0
        RETURN @results
    END 
    EXEC @hr = sp_OAMethod @objRegExp, 'Test', @results OUTPUT, @source
    IF @hr <> 0 BEGIN
        SET @results = 0
        RETURN @results
    END
    EXEC @hr = sp_OADestroy @objRegExp
    IF @hr <> 0 BEGIN
        SET @results = 0
        RETURN @results
    END
RETURN @results
END
1 голос
/ 08 июня 2009

Эта ссылка является статьей для написания регулярных выражений через библиотеку VBScript.Regex на вашем сервере: http://www.sqlteam.com/article/regular-expressions-in-t-sql

Он связывается с библиотекой Regex через OLE Automation , которая по умолчанию отключена, поскольку представляет угрозу безопасности.

Мое мнение таково: Regex через CLR .

0 голосов
/ 08 июня 2009

Это немного похоже на использование молотка для приготовления тоста с маслом, но вы можете использовать поддержку регулярных выражений в типе данных xml через фасет шаблона. Затем вы определяете, соответствует ли регулярное выражение или нет, пытаясь выполнить синтаксический анализ как набранный xml, если вы перейдете к блоку catch с ошибкой 6926, тогда ваше регулярное выражение не совпадет (простая ошибка проверки типа) Вот пример, который применяет регулярное выражение из 3 десятичных цифр, за которыми следуют 6 букв:

create xml schema collection regexTest1 as '<xs:schema targetNamespace="http://example/regexTest"
                  elementFormDefault="qualified"
                  xmlns="http://example/regexTest"
                  xmlns:mstns="http://tempuri.org/XMLSchema.xsd"
                  xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="regexTest">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:pattern value="\p{Nd}{3}\p{L}{6}"></xs:pattern>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>
</xs:schema>'


declare @x xml(dbo.regexTest1), @regexPass bit
begin try
    set @x = '<regexTest xmlns="http://example/regexTest">111abcdef</regexTest>'
    set @regexPass=1
end try
begin catch
    if (error_number()=6926)
    begin
        set @regexPass=0
    end
    else begin
        declare @errMsg varchar(8000), @errSev int, @errState int
        select @errMsg='Regex check was unable to process, native error: (' 
            + cast(error_number() as varchar(16))
            + ') - '
            + error_message(),
            @errSev=error_severity(),
            @errState=error_state()

        raiserror(@errMsg, @errSev, @errState)
    end
end catch
select @regexPass

Редактировать - если вы идете по этому пути, спецификация для поддержки регулярных выражений в XSD находится на http://www.w3.org/TR/xmlschema-2/#dt-regex

0 голосов
/ 08 июня 2009

Я думаю, что PATINDEX - самый близкий к нативному t-sql.

http://msdn.microsoft.com/en-us/library/ms188395.aspx

также см.

http://msdn.microsoft.com/en-us/library/ms187489.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...