SQLCLR Projects: come referenziare assembly esterne

Visual Studio 2005 mette a disposizione diversi template per la creazione di progetti SQLCLR. Creando un progetto ci accorgeremo ben presto che è impossibile utilizzare delle reference, salvo alcune predefinite dall’IDE.

Per ovviare a tale limitazione è necessario “sporcarsi le mani” all’interno dei file di progetto e seguire alcuni semplici passaggi.  La solution che ho creato e che potete scaricare qui è composta da due proget

  • MySQLCLRAssembly: il progetto SQLCLR al cui interno troviamo la funzione MyFunction
  • MyAssembly: la nostra assembly esterna o “di terze parti” che vogliamo usare nel progetto SQLCLR

Per prima cosa dobbiamo compilare il progetto MyAssembly , ottenendo nella cartella /bin/debug il file MyAssembly.dll

Il secondo step da compiere è quello di aprire con un qualsiasi editor di testo il file MySQLCLRAssembly.csproj (file di definizione del nostro progetto), identificare al suo interno la sezione ed aggiungere questo nuovo frammento xml:

    False      C:\Projects\SQLCLRExternalReference\MyAssembly\bin\Debug\MyAssembly.dll

Il path C:\Projects\MyAssembly\bin\Debug\MyAssembly.dll è il percorso dove risiede l’assembly compilata precedentemente.

Dopo aver salvato le modifiche riaprire il progetto MySQLCLRAssembly e verificare che nella lista delle reference ci sia MyAssembly.

A questo punto possiamo utilizzare la nostra nuova reference all’interno del nostro progetto SQL CLR:

using System.Data.SqlTypes; using Microsoft.SqlServer.Server; using MyAssembly;

public class UserDefinedFunctions {     [SqlFunction]     public static SqlString MyFunction()     {         Myclass myclass = new Myclass();         return new SqlString(myclass.DoSothing());     } };

L’ultimo passo per poter finalmente utilizzare la nostra funzione anche da T-SQL è l’operazione di deploy su SQL Server. Visual Studio mette a disposizione il comando “Deploy” per installare su SQL tutto il necessario, ma nel nostro caso particolare dovremmo utilizzare degli statement T-SQL manuali. Ecco come:

Carichiamo MyAssembly.dll

CREATE ASSEMBLY [MyAssembly] AUTHORIZATION [dbo] FROM ‘C:\Projects\SQLCLRExternalReference\MySQLCLRAssembly\bin\Debug\MyAssembly.dll’ WITH PERMISSION_SET = SAFE GO

Carichiamo MySQLCLRAssembly.dll:

CREATE ASSEMBLY [MySQLCLRAssembly] AUTHORIZATION [dbo] FROM ‘C:\Projects\SQLCLRExternalReference\MySQLCLRAssembly\bin\Debug\MySQLCLRAssembly.dll’ WITH PERMISSION_SET = SAFE GO

Eseguiamo lo statement di CREATE della nuova UDF:

CREATE FUNCTION [dbo].[MyFunction]() RETURNS [nvarchar](4000) WHIT EXECUTE AS CALLER AS EXTERNAL NAME [MySQLCLRAssembly].[UserDefinedFunctions].[MyFunction] GO

Con quest’ ultimo passaggio saremo in grado di usufrire della funzione MyFunction che non farà nient’altro che chiamare il metodo DoSomething all’interno della nostra assembly custom MyAssembly.dll.