A veces hay que comunicar una base de datos con un programa, otras veces ampliar una BBDD con librerías que sean invocadas desde procedimientos almacenados… En definitiva, a veces se hace necesario inyectar dlls en SQL Server para que realice algo propio de .NET y no de BBDD.

Para realizar la operación crearemos un procedimiento almacenado CLR, es decir un procedimiento que ejecuta código .NET encapsulado en una dll.

Para ello, se añade un proyecto de base de datos.poc1

Y se añade un procedimiento almacenado CLR con c#
poc2

Una vez generado se procede añadir la librería generada en el paso anterior y a modificar el procedimiento para que pueda hacer uso de el

public partial class StoredProcedures{

[Microsoft.SqlServer.Server.SqlProcedure]

public static void SPPOCInvoker (int param1)
{
// Put your code here
try
{
SqlPipe sqlPipe = SqlContext.Pipe;
string result = Optimissa.POC.SQLCLR.BL.WebserviceInvoker.Invoke(param1);
SqlContext.Pipe.Send(result);
}
catch (Exception ex)
{
SqlContext.Pipe.Send(ex.Message);
}
}
}

Por último, se procede a compilar toda la solución y a abrir el SQL Management Studio, donde se crea una base de datos para probar el resultado de todo lo anteriormente expuesto.

Se procederá a ejecutar los siguientes scripts que se muestran a continuación:

  •   Habilita el uso de código manejado

alter database POCSQLCLR
set trustworthy on;
n  Habilitar el uso del CLR (Common Languaje Runtime de .NET)

EXEC sp_configure ‘clr enabled’, ‘1’;
RECONFIGURE;

  •   Registro de las librerías generadas

CREATE ASSEMBLY [POC.SQLCLR.BL]
FROM ‘D:\Projects\Pruebas de concepto\POC.SQLCLR.DataBase\bin\Debug\POC.SQLCLR.BL.dll’
WITH PERMISSION_SET = UNSAFE;

CREATE ASSEMBLY [Optimissa.POC.SQLCLR.DataBase]
FROM ‘D:\Projects\Pruebas de concepto\POC.SQLCLR\POC.SQLCLR.DataBase\bin\Debug\POC.SQLCLR.DataBase.dll’
WITH PERMISSION_SET = UNSAFE;

En este punto cabe destacar que, si alguna de las anteriores dlls falla por la necesidad de la inclusión de alguna librería del .net Framework, este se encuentra en la siguiente carpeta:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\

Y como se muestra se deberá ejecutar el siguiente script por cada una que no necesite

CREATE ASSEMBLY [POC.SQLCLR.BL]
FROM C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.ServiceModel.dl’
WITH PERMISSION_SET = UNSAFE;

  • Generación del procedimiento almacenado:

CREATE PROCEDURE [dbo].[SPPOCInvoker]
@param1 INT
AS EXTERNAL NAME [Optimissa.POC.SQLCLR.DataBase].[StoredProcedures].[SPPOCInvoker]

  •   Probar el resultado del procedimiento

EXEC [dbo].[SPPOCInvoker] 8;

Por último destacar que todas las librerías que se inyecten tienen que ser puras de .NET framework, no puede ser mixtas, por esa misma razón no se puede insertar el system.Servimodel, ya que esta depende de Microsoft.Transaction que no es nativa pura.

 

Espero que sea de utilidad!

Anuncios