Condividi tramite


Introduzione all'integrazione con CLR

In questo argomento viene fornita una panoramica delle librerie e degli spazi dei nomi necessari per compilare oggetti di database utilizzando l'integrazione di Microsoft SQL Server con Common Language Runtime (CLR) di .NET Framework. 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

A partire da SQL Server 2005, 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

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 utilizza due nuove classi, SqlContext e SqlPipe, per creare oggetti di database gestiti e restituire un messaggio di testo semplice. Il metodo assegna inoltre la stringa "Hello world!" come valore di un parametro di output. Questo metodo può essere dichiarato come stored procedure in SQL Server e quindi eseguito allo stesso modo come stored procedure Transact-SQL.

Il programma verrà quindi compilato come libreria, caricato in SQL Server ed eseguito come stored procedure.

Compilazione della stored procedure "Hello World"

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. Esempio:

C:\Windows\Microsoft.NET\Framework\v2.0.31113

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 compilare la stored procedure 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 AdventureWorks2008R2.

L'esecuzione di codice CLR (Common Language Runtime) in SQL Server è disattivata per impostazione predefinita. Il codice CRL può essere abilitato utilizzando la stored procedure di sistema sp_configure. Per ulteriori informazioni, vedere Abilitazione dell'integrazione con CLR.

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

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