2009-06-08 2 views
2

Ich bin auf der Suche nach einer Funktion, die in der Lage wäre, das gleiche wie die MySQL REGEX-Funktion für TSQL zu tun. Grundsätzlich muss ich meine Abfrage in etwa wie folgt aussehen:SQL Regex-Funktion, die der MySql REGEX-Funktion ähnelt

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

Ich bin nicht CLR Keen zu diesem Zeitpunkt zu verwenden.

Irgendwelche Ideen?

+0

ich vorausgesetzt, Sie Fragen über MSSQL-Server auf der Grundlage der anderen Antworten, lesen Sie erneut Ihre Frage Ich denke, ich bin nicht so sicher. Kannst du klären, welche db? – ahains

+0

Ja, es ist MsSQL. – Neale

Antwort

1

LFSR hat recht über die CLR. Gehen Sie für CLR, aber die Funktion unten funktioniert auch großartig. Ich habe den Code getestet, während LFSR die obige Antwort gepostet hat.

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 
0

Es ist ein bisschen wie mit einem Hammer sehen zu gebutterten Toast zu machen, aber Sie können die Regex Unterstützung in dem XML-Datentyp über die Muster Facette verwenden. Dann bestimmen Sie, ob die Regex übereinstimmt oder nicht, indem Sie versuchen, als typisiertes XML zu analysieren. Wenn Sie mit err 6926 zum catch-Block springen, stimmt Ihre Regex nicht überein (simple type validation err). Hier ist ein Beispiel, das die regex von 3 Dezimalstellen gefolgt von 6 Buchstaben erzwingt:

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 

Bearbeiten - wenn Sie diesen Weg gehen, die Spezifikation für die regex Unterstützung in XSD ist bei http://www.w3.org/TR/xmlschema-2/#dt-regex

+0

"wie mit einem Hammer gebutterten Toast zu machen" - das ist ein Juwel! –

Verwandte Themen