SQL Server is een prima Database Engine en biedt diverse mogelijkheden om de integriteit van de data te behouden. Een functionaliteit die echter niet standaard beschikbaar is, is Regular Expressions. Maar dat is op te lossen door de CLR ondersteuning.

SQL Server is een prima Database Engine en biedt diverse mogelijkheden om de integriteit van de data te behouden. Een functionaliteit die echter niet standaard beschikbaar is, is Regular Expressions. Maar dat is op te lossen door de CLR ondersteuning.
Common Language Runtime
SQL Server bied ondersteuning voor de Common Language Runtime (CLR). In het kort komt het er op neer dat je .NET assemblies (.dll’s) in SQL server kunt importeren en dat je op die manier StoredProcedures, Functions, DataTypes en Triggers kunt bouwen in .NET. Je kunt deze gewoon schrijven in C# of VB.NET, met alle mogelijkheden van dien.
RegEx in .NET
Waar SQL Server dus functionaliteit te kort komt, kunnen we deze zelf aanvullen. In .NET vinden we namelijk wel de ondersteuning voor Regular Expressions.
Eerst maken we een Database CLR project aan.
SQL Server en Regular Expression Checks
Binnen het project kiezen we voor een nieuwe User Defined Function
SQL Server en Regular Expression Checks
De implementatie van de functie kan er als volgt uitzien:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Text.RegularExpressions;
public partial class UserDefinedFunctions
{
    public static readonly RegexOptions Options =
           RegexOptions.IgnorePatternWhitespace |
           RegexOptions.Singleline;
    [SqlFunction]
    public static SqlBoolean RegexMatch(SqlChars input, SqlString pattern)
    {
        Regex regex = new Regex(pattern.Value, Options);
        return regex.IsMatch(new string(input.Value));
    }
};
Je ziet dat er een functie ‘RegexMatch’ wordt aangemaakt. Als parameter kun je te tekst opgeven die gecontroleerd moet worden en de RegularExpression waaraan voldaan moet worden. De functie retourneert ‘true’ of ‘false’.
Deploy en gebruik
Nadat we het project deployen vanuit Visual Studio naar SQL server, kunnen we de functie gaan gebruiken. De functie is aan te roepen als functie in een query.
select dbo.RegexMatch( N'123-45-6789', N'^\d{3}-\d{2}-\d{4}$' )
Maar is ook te gebruiken als in een CHECK contraint, zodat er geen waardes in een tabel geplaatst kunnen worden die niet voldoen aan de gestelde voorwaarde.
CREATE TABLE [Account]
(
    [AccountNumber] nvarchar(20) CHECK (dbo.RegexMatch(
        [AccountNumber], '^[A-Z]{3,5}\d{5}-\d{3}$' ) = 1)
    [ZipCode] nvarchar(10) CHECK (dbo.RegexMatch(
        [ZipCode], '^[1-9][0-9]{3}\s?[a-zA-Z]{2}$' ) = 1)
)
Meer info
Een Regular Expression gebruiken is 1, een Regular Expression bedenken is wat anders. Daarom laat ik me vaak inspireren door websites als: http://www.regexlib.com
Dit is slechts een klein voorbeeld van de mogelijkheden van CLR ondersteuning in SQL server. Meer informatie vind je hier: http://msdn.microsoft.com/en-us/library/6s0s2at1(v=VS.80).aspx
Een uitgebreider voorbeeld van Regular Expressions en SQL server vind je hier:
http://msdn.microsoft.com/en-us/magazine/cc163473.aspx