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:
<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 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
WITH PERMISSION_SET = SAFE
GO
Carichiamo MySQLCLRAssembly.dll:
WITH PERMISSION_SET = SAFE
GO
Eseguiamo lo statement di CREATE della nuova UDF:
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.