F# no SQL Server

Boa noite pessoas!

No artigo desta semana, estarei demonstrando a criação de funções UNSAFE em um ambiente de integração CLR com o SQL Server. Um detalhe importante é o uso do F#, uma das novas linguages suportadas pelo Visual Studio 2008 e 2010. 

Para aqueles que desejam aprender um pouco mais sobre F#, abaixo segue o link de um artigo muito bom do Ted Neward:
http://msdn.microsoft.com/pt-br/magazine/cc164244.aspx

Microsoft F# May 2009 CTP

Para esta demonstração, estarei utilizando o Visual Studio 2008 com Microsoft F# May 2009 CTP, esta distribuição do F# além de ser bem diferente das primeiras, possui uma boa integração com o Visual Studio. Abaixo o link para download:
http://www.microsoft.com/downloads/details.aspx?FamilyID=7bb32f32-9fac-4f34-ad56-b0bda130cf00&displaylang=en

Criando um assembly CLR com F#:

Após instalar o CTP, além dos templates convencionais do Visual Studio 2008, haverá três modelos para trabalhar com o F#, o que utilizarei será o “F# Library”:

Como comentei no segundo artigo de Integração CLR, são necessárias algumas DLLs para o desenvolvimento dos competentes CLR para o SQL Server. Visto que nem todas as DLLs necessárias estão referenciadas no projeto desta demonstração, será necessário adicioná-las, clicando com o botão direito do mouse sobre “References”, opção “Add References…”:

 

A primeira referencia é a System.Data, que é responsável pelas bibliotecas ADO.Net:

E a segunda, System.Xml, responsável pelos objetos que estarão presentes na comunicação do SQL-CLR.

Para o desenvolvimento de um assembly semelhante ao do segundo artigo de Integração CLR, criarei um arquivo com extensão “fs” (lembrando que nos projetos F#, o nome do arquivo corresponde ao nome da classe no assembly).

Neste arquivo, primeiramente adicionarei as referencias aos tipos e entidades do SQL Server (semelhante ao using do C#):

open System.Data.SqlTypes
open Microsoft.SqlServer.Server

Em seguida, escreverei a função que calculará Pitagoras em F#:

[<SqlFunction>]
let Pitagoras (ab : SqlDouble, bc : SqlDouble) =
    let AB = ab.Value
    let BC = bc.Value
    let AC = sqrt((AB * AB) + (BC * BC))
    AC

Para a publicação, será necessária também a DLL da FSharp.Core. De forma a agilizar o processo, acessarei as propriedades da referência FSharp.Core:

 

Em seguida habilitando a propriedade “Copy Local”:

Após criar uma release do projeto, na pasta bin\Release estarão os dois assemblies necessários para a integração.

Publicando os assemblies no SQL Server: 

Agora no SQL Server, habilitarei a integração com CLR:

sp_configure 'clr enabled', 1
RECONFIGURE
GO

E no banco de dados, habilitarei a utilização de assemblies UNSAFE:

ALTER DATABASE [Nome do banco de dados]
SET TRUSTWORTHY ON
GO

Depois será necessário adicionar os dois assemblies com a opção de PERMISSION_SET = UNSAFE, conforme a sintaxe:

USE [Nome do banco de dados]
GO
CREATE ASSEMBLY [Nome do assembly]
FROM 'Caminho do assembly'
WITH PERMISSION_SET = UNSAFE
GO

Primeiramente, criarei o para FSharp.Code.dll e em seguida a DLL do componente, exemplo:

USE [SqlFromHell]
GO
CREATE ASSEMBLY [FSharp.Core]
FROM 'D:\FSharp.Core.dll'
WITH PERMISSION_SET = UNSAFE
GO
CREATE ASSEMBLY [FS_SQL]
FROM 'D:\FS_SQL.dll'
WITH PERMISSION_SET = UNSAFE
GO

Para a criação da função SQL é possível utilizar a seguinte sintaxe:

CREATE FUNCTION [dbo].[Nome da função SQL]
RETURNS [float]
AS
EXTERNAL NAME [Nome do assembly].[Nome da classe].[Nome da função]
GO

Exemplo:

CREATE FUNCTION [dbo].[Pitagoras] (@AB [float], @BC [float])
RETURNS [float]
AS
EXTERNAL NAME [FS_SQL].[Pitagoras].[Pitagoras]
GO

Depois, basta testar:

SELECT dbo.Pitagoras(3,2)

Considerações finais:

Na realidade, a DLL que é considera UNSAFE pelo SQL Server é a FSharp.Core, mas como o componente desenvolvido faz uso da FSharp.Code, ela somente necessitará ser considerada UNSAFE para ser executada.

Para as futuras release da .Net Framework e do Visual Studio, acredito que também existirá os mesmos templates que existem para o C#, J# e VB.Net também para o F#, visto que na internet existem diversos exemplo de implementação do com aplicações Windows, Web e até mesmo com SilverLight.

Finalizando esta séria de artigos sobre CLR, é perceptível como existem muitas possibilidades com o SQL Server tão pouco exploradas pelos profissionais de banco de dados e até mesmo desconhecidas pelos desenvolvedores.

As facilidades de integração com SQL Server também estão presentes em outras formas de integração como o SMO, ADO.Net e serviços do SQL Server como Integration Services e Reporting Services, permitindo os profissionais de banco de dados e desenvolvedores utilizarem o máximo de sua criatividade para criar soluções para o mundo coorporativo.

Ainda estou pensando se vou terminar por aqui a série de artigos sobre SQL-CLR, então se tiverem alguma dúvida ou dica para um novo artigo, poderá ser grandemente útil para elaboração dos próximos artigos.

Artigos relacionados:

Habilitando CLR no SQL Server:
https://sqlfromhell.wordpress.com/2009/09/19/habilitando-clr/

Criando funções CLR para o SQL Server:
https://sqlfromhell.wordpress.com/2009/09/26/funcoes-clr/

Debug de funções CLR no SQL Server:
https://sqlfromhell.wordpress.com/2009/10/03/debug-clr/

Publicando Assemblies e Funções CLR no SQL Server
https://sqlfromhell.wordpress.com/2009/10/10/publicando-clr/

O melhor site de F# que já encontrei:

FSharp.it – Functional programming on .Net
http://fsharp.it/

Anúncios

5 pensamentos sobre “F# no SQL Server

  1. Pingback: F# February 2010 CTP « Sql From Hell.com

  2. Pingback: Publicando Assemblies CLR no SQL Server pelo Visual Studio « Sql From Hell.com

  3. Pingback: O que mudou nos projetos SQL CLR do Visual Studio 2010? « Sql From Hell.com

  4. Pingback: Trabalhando com SQL CLR – Resumo « SQL From Hell.com

  5. Pingback: Trabalhando com SQL CLR – Resumo « SQL From Hell.com

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s