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 <ItemGroup> ed aggiungere questo nuovo frammento xml: 

    <Reference Include="MyAssembly" >
    <SpecificVersion>False</SpecificVersion>
     <HintPath> C:\Projects\SQLCLRExternalReference\MyAssembly\bin\Debug\MyAssembly.dll </HintPath>
    </Reference>


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.