Introduzione all'integrazione con CLR

Si applica a: sìSQL Server (tutte le versioni supportate)

In questo argomento viene fornita una panoramica degli spazi dei nomi e delle librerie necessari per compilare oggetti di database usando Microsoft SQL Server l'integrazione con .NET Framework Common Language Runtime (CLR). In questo argomento viene inoltre illustrato come scrivere, compilare ed eseguire una stored procedure CLR semplice scritta in Microsoft Visual C#.

Spazi dei nomi necessari

I componenti necessari per sviluppare oggetti di database CLR di base vengono installati con SQL Server . La funzionalità di integrazione CLR viene esposta in un assembly denominato system.data.dll, che fa parte di .NET Framework. Questo assembly è disponibile in Global Assembly Cache (GAC) e nella directory di .NET Framework. Poiché un riferimento a questo assembly viene in genere aggiunto tramite gli strumenti della riga di comando e Microsoft Visual Studio, non è necessario aggiungerlo manualmente.

L'assembly system.data.dll contiene gli spazi dei nomi seguenti, necessari per la compilazione di oggetti di database CLR:

  • System.Data
  • System.Data.Sql
  • Microsoft.SqlServer.Server
  • System.Data.SqlTypes

Suggerimento

Il caricamento di oggetti di database CLR in Linux è supportato, ma deve essere compilato con il .NET Framework (SQL Server l'integrazione con CLR non supporta .NET Core). Inoltre, gli assembly CLR con il EXTERNAL_ACCESS o un set di autorizzazioni UNSAFE non sono supportati in Linux.

Scrittura di una stored procedure "Hello World" semplice

Copiare e incollare il codice Visual C# o Microsoft Visual Basic seguente in un editor di testo e salvarlo in un file denominato "helloworld.cs" o "helloworld.vb".

using System;  
using System.Data;  
using Microsoft.SqlServer.Server;  
using System.Data.SqlTypes;  
  
public class HelloWorldProc  
{  
    [Microsoft.SqlServer.Server.SqlProcedure]  
    public static void HelloWorld(out string text)  
    {  
        SqlContext.Pipe.Send("Hello world!" + Environment.NewLine);  
        text = "Hello world!";  
    }  
}  
Imports System  
Imports System.Data  
Imports Microsoft.SqlServer.Server  
Imports System.Data.SqlTypes  
Imports System.Runtime.InteropServices  
  
Public Class HelloWorldProc  
    \<Microsoft.SqlServer.Server.SqlProcedure> _   
    Public Shared  Sub HelloWorld(\<Out()> ByRef text as String)  
        SqlContext.Pipe.Send("Hello world!" & Environment.NewLine)  
        text = "Hello world!"  
    End Sub  
End Class  
  

Questo semplice programma contiene un singolo metodo statico su una classe pubblica. Questo metodo usa due nuove classi, SqlContext e SqlPipe, per la creazione di oggetti di database gestiti per l'output di un semplice messaggio di testo. Il metodo assegna anche la stringa "Hello world!" come valore di un parametro out. Questo metodo può essere dichiarato come stored procedure in SQL Server e quindi eseguito allo stesso modo come stored procedure Transact-SQL.

Compilare il programma come libreria, caricarlo in SQL Server ed eseguirlo come stored procedure.

Compilare il Hello World "stored procedure

Per impostazione predefinita, SQL Server installa i file di ridistribuzione di Microsoft .NET Framework. Tali file includono csc.exe e vbc.exe, i compilatori della riga di comando per programmi Visual C# e Visual Basic. Per compilare l'esempio, è necessario modificare la variabile del percorso in modo che punti alla directory contenente csc.exe o vbc.exe. Di seguito viene indicato il percorso di installazione predefinito di .NET Framework.

C:\Windows\Microsoft.NET\Framework\(version)

version contiene il numero di versione del file di ridistribuzione di .NET Framework installato. Ad esempio:

C:\Windows\Microsoft.NET\Framework\v4.6.1

Dopo avere aggiunto la directory di .NET Framework al percorso, è possibile compilare la stored procedure di esempio in un assembly con il comando indicato di seguito. L'opzione /target consente di compilarla in un assembly.

Per i file di origine di Visual C#:

csc /target:library helloworld.cs

Per i file di origine di Visual Basic:

vbc /target:library helloworld.vb

Questi comandi consentono di avviare il compilatore Visual C# o Visual Basic utilizzando l'opzione /target per specificare la compilazione di una DLL della libreria.

Caricamento ed esecuzione della stored procedure "Hello World" in SQL Server

Dopo avere compilato la procedura di esempio, è possibile testarla in SQL Server. A tale scopo, aprire SQL Server Management Studio e creare una nuova query, connettendosi a un database di test appropriato, ad esempio il database di esempio AdventureWorks.

L'esecuzione di codice CLR (Common Language Runtime) in SQL Server è disattivata per impostazione predefinita. Il codice CLR può essere abilitato usando il sp_configure di sistema stored procedure. Per altre informazioni, vedere Enabling CLR Integration.

A questo punto è necessario creare l'assembly per poter accedere alla stored procedure. Ai fini dell'esempio, si presuppone che sia stato creato l'assembly helloworld.dll nella directory C:. Aggiungere l'istruzione Transact-SQL seguente alla query:

CREATE ASSEMBLY helloworld from 'c:\helloworld.dll' WITH PERMISSION_SET = SAFE

Dopo avere creato l'assembly, è possibile accedere al metodo HelloWorld utilizzando l'istruzione CREATE PROCEDURE. La stored procedure verrà denominata "hello":

CREATE PROCEDURE hello  
@i nchar(25) OUTPUT  
AS  
EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld  
-- if the HelloWorldProc class is inside a namespace (called MyNS),  
-- the last line in the create procedure statement would be  
-- EXTERNAL NAME helloworld.[MyNS.HelloWorldProc].HelloWorld  

Una volta creata, la stored procedure può essere eseguita come una normale stored procedure scritta in Transact-SQL. Eseguire il comando seguente:

DECLARE @J nchar(25)  
EXEC hello @J out  
PRINT @J  

Verrà restituito l'output seguente nella finestra dei messaggi di SQL Server Management Studio.

Hello world!  
Hello world!  

Rimozione della stored procedure "Hello World" di esempio

Al termine dell'esecuzione della stored procedure di esempio, è possibile rimuovere la procedura e l'assembly dal database di test.

Rimuovere innanzitutto la procedura utilizzando il comando drop procedure.

IF EXISTS (SELECT name FROM sysobjects WHERE name = 'hello')  
   drop procedure hello  

Dopo avere eliminato la procedura, è possibile rimuovere l'assembly contenente il codice di esempio.

IF EXISTS (SELECT name FROM sys.assemblies WHERE name = 'helloworld')  
   drop assembly helloworld  

Passaggi successivi

Per altre informazioni sull'integrazione con CLR in SQL Server, vedere gli articoli seguenti: