Esse ?? um t??pico que ir?? mostrar algo que definitivamente voc?? j?? precisou mas n??o sabia como fazer e que facilitar?? (e muito) alguns trabalhos. Programadores que usam o Bando de Dados para programar sendo por Stored Procedure, Functions e Triggers j?? passaram por maus bocados para preparar um algoritmo que realizasse um determinado processo, mas que esse mesmo algoritmo ?? mais f??cil de ser escrito (ou possuir funcionalidades que o SGDB n??o possui) em outra linguagem de programa????o. Por exemplo: validar e-mail. ?? poss??vel no SQL Server fazermos um Function que receba um VARCHAR e retorne um BIT informando que um e-mail ?? v??lido ou n??o, contudo seria uma fun????o um tanto que trabalhosa para quem n??o est?? familiarizado com programa????o em banco. Para quem desenvolve em ASP.NET (C# ou VB.NET) basta usarmos express??o regular que, em duas linhas, resolve o problema. Portanto iremos utilizar uma fun????o escrita em C# compilada em uma DLL e usarmos em um Function no SQL Server. Isso ?? poss??vel atrav??s do CLR.
Primeiramente vamos criar a DLL contendo a fun????o (no nosso exemplo vamos fazer a que valida e-mail – mas voc?? pode desenvolver a que quiser). Abra o Visual Studio e crie um Project. Em Project Type escolha Visual C# Windows e o Template opte por uma Class Libary. Note que quando voc?? cria uma classe vem com o nome Class1.cs. Para facilitar a compreens??o, renomeie para FuncoesSql.cs (ou outra) e remova o namespace criado. Agora, escreva a fun????o que deseja e adicione os namespaces necess??rios ficando da seguinte forma:
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Text;
using System.Text.RegularExpressions;
using Microsoft.SqlServer.Server;
public partial class FuncoesSql
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlBoolean IsMailValido(SqlString email)
{
// Cria um objeto de express??es regulares para validar e-mail
Regex expressaoRegular = new Regex(@”^(([^<>()[]\.,;:s@””]+”
+ @”(.[^<>()[]\.,;:s@””]+)*)(“”.+””))@”
+ @”(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}”
+ @”.[0-9]{1,3}])(([a-zA-Z-0-9]+.)+”
+ @”[a-zA-Z]{2,}))$”);
// Realiza um teste na valida????o da express??o
return new SqlBoolean(expressaoRegular.IsMatch(email.ToString()));
}
}
No caso, precisamos explicitar os tipos de entrada e sa??da utilizados pelo banco de dados para que n??o haja problemas de tipagem. Poderia ser qualquer fun????o ou quantas que quisesse, contanto que respeite os tipos. Agora compile a DLL pressionando F6 ou pelo menu Build. J?? temos a DLL com a fun????o. Copie a DLL (que est?? na pasta binDebug de sua solu????o) e coloque-a em um local onde seu Banco de Dados possa busc??-la. Para exemplo, colocarei em C:SqlDlls no Servidor.
O pr??ximo passo ?? verificar se no SQL Server est?? ativo a funcionalidade CLR, para isso v?? em Iniciar > Todos os Programas > Microsft SQL Server 2008 (ou 2005) > Configuration Tools > SQL Server Surface Area Configuration. Entre em Surface Area Configuration for Features e na guia CLR Integration verifique se a fun????o est?? habilitada. Se n??o estiver, habilite.
D?? OK e agora j?? poder?? usar CLR no SQL Server. Abra o SQL Server Management Studio, conecte-se na base desejada e execute as seguintes instru????es SQL (abra um New Query para isso):
— CRIA O ASSEMBLY INDICANDO SUA ORIGEM
CREATE ASSEMBLY FuncoesSql FROM ‘C:SqlDllsFuncoesSqlServerASPNET.dll’
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
— CRIA A FUN????O
CREATE FUNCTION dbo.Fun_Valida_Mail (@email NVARCHAR(350))
RETURNS BIT
— INDICA A ORIGEM DA FUN????O SQL: ASSEMBLY > CLASSE > FUN????O
AS EXTERNAL NAME [FuncoesSql].FuncoesSql.IsMailValido
GO
Agora execute a Query (ou pressione F5)… Foi criada a fun????o! Pronto… agora ?? s?? usar como se fosse uam fun????o do SQL Server normalmente. Abaixo tem alguns exemplos de consulta e seus retornos:
Execu????es:
SELECT dbo.Fun_Valida_Mail(‘tmarcal@gmail’)
SELECT dbo.Fun_Valida_Mail(‘tmarcal@gmail.com’)
SELECT dbo.Fun_Valida_Mail(‘tmarcal.. @gmail.com’)
Retorno:
0
1
0
Apesar do trabalho inicial, pode-se aproveitar muito de ambos os recursos e criar cada vez mais fun????es complexas. Quanto ao desempenho da CLR, em compara????o ao T-SQL, deve-se ficar a mesma coisa. A diferen??a ?? praticamente impercept??vel. Espero que tenham gostado… At?? breve!