Criando e Executando um assembly pelo SQL Server

Fala Galera,

Todos sabemos que a linguagem T-SQL possui limitações, alguma vez você já precisou fazer algum processo muito elaborado e acabou esbarrando em alguma delas?

Pois é, saiba que o SQL Server possuí uma integração com linguagens de programação, Visual Basic e C#, o que nos permite utilizar todas suas vantagens.

Vamos inciar criando uma nova base de dados para os exemplos:


CREATE DATABASE EX_ASSEMBLY

GO

USE EX_ASSEMBLY

GO

O Common Runtime Language, por default, não vem habilitada na instancia, portanto será necessário faze-lo antes de iniciarmos.


EXEC sp_configure 'ADVANCED OPTIONS',1

RECONFIGURE WITH OVERRIDE

GO

EXEC sp_configure 'clr enabled',1

RECONFIGURE WITH OVERRIDE

Também habilitaremos o CMDShell para que possamos compilar a dll de dentro do SQL (poderia ser realizado pelo prompt de comando)


EXEC sp_configure 'xp_cmdshell',1

RECONFIGURE WITH OVERRIDE

Agora iremos criar uma função em C# bem simples, que irá concatenar uma string passada por parâmetro, a criação poderá ser realizada no notepad e salva com a extensão .cs .


using System;

using System.Data;

using System.Data.Sql;

using System.Data.SqlTypes;

using Microsoft.SqlServer.Server;

public partial class TesteBlogPiroto{

[SqlProcedure]

public static void ConcatenandoTexto(String parametro1){

String parametro = string.Concat("Blog do:", parametro1);

SqlContext.Pipe.Send(parametro);

}

};

Após criarmos o arquivo, que no meu exemplo está na raíz do diretório D:\ , nós precisaremos transforma-lo em uma DLL, para isso será necessário utilizar o comando xp_cmdshell, que nos permite executar comandos shell. Para compilar, precisamos do diretório que o nosso .net framework está instalado (no meu caso a versão usada é a 2).


declare @comando varchar(2000)

set @comando =
'C:\Windows\Microsoft.NET\Framework\v2.0.30319\csc
/target:library
/out:d:\BlogPiroto.dll d:\artigo.cs'

exec xp_cmdshell @comando

Depois de criarmos a dll será necessário importar seu conteúdo para o SQL Server e para isso iremos utilizar a instrução ‘create assembly’:


Create Assembly exBlogPiroto from  'D:\BlogPiroto.dll'
WITH PERMISSION_SET = SAFE

É de extrema importância atentarmos ao permissionamento concedido a um assembly criado, existem três opções:

Safe: O mais restritivo, além de ser a opção default e recomendado pela MS, restringe o acesso do assembly a somente o SQL Server.

UnSafe: Tem acesso irrestrito a todos os recursos da maquina, registro, rede, variaveis do sistema etc.

External_Access: Tem Acesso restrito aos recursos da maquina, pode usar código não gerenciado.

Nao esqueça de ser uma versão suportada pelo SQL, caso contrário o seguinte erro será apresentado

1

Depois de importar o assembly iremos criar uma procedure que fará referência ao método contido na dll.


CREATE PROCEDURE SP_CHAMAASSEMBLY

 (@PARAMETRO NVARCHAR(MAX))

AS EXTERNAL NAME
 EXBLOGPIROTO.TESTEBLOGPIROTO.CONCATENANDOTEXTO

O external name é formado da seguinte forma>  [Nome do Assembly].[Nome da Classe].[Nome do Método]

Agora faremos uma chamada a nossa recém criada procedure passando como parametro o texto a ser concatenado.


EXEC SP_CHAMAASSEMBLY ' DHIEGOPIROTO@GMAIL.COM '

Retorno:

2

Por hoje é isso pessoal!

[]’s

Alex Souza

Banco de dados, Business Intelligence, Big Data, Governança de TI ... /* Um eterno aprendiz... */

Blog - Thiago Carlos de Alencar

Aprendendo SQL Server !

SQL Authority with Pinal Dave

SQL Server Performance Tuning Expert

Vitor Fava

SELECT (CrazyIdeas*2), (InsaneIdeas*100), MyExperience FROM MyBigHead WHERE InsaneLevel > 1000

Think Think SQL

DBCC DumpMemory 'TECH','ALL'

Gustavo Maia Aguiar

Artigos, dicas e algumas reflexões sobre o SQL Server

Kimberly L. Tripp

DBCC DumpMemory 'TECH','ALL'

Thiago Zavaschi R2

www.zavaschi.com

Blog do Luti

DBCC DumpMemory 'TECH','ALL'

Luan.Moreno a.k.a [SQL.Soul]

Lead Database Consultant at Pythian

Blog do Leka

let's make things better