Introduzione all'integrazione di CLR
Si applica a:SQL Server
Questo articolo offre una panoramica dei namespace e delle librerie necessari per assemblare oggetti di database usando l'integrazione di SQL Server con il Common Language Runtime (CLR) del .NET Framework. L'articolo illustra anche come scrivere, compilare ed eseguire una piccola procedura memorizzata CLR scritta in C# e in Visual Basic .NET.
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 chiamato System.Data.dll
, che fa parte di .NET Framework. Questo assembly è disponibile nella Global Assembly Cache (GAC) e nella directory .NET Framework. In genere, un riferimento a questo assembly viene aggiunto automaticamente dagli strumenti da riga di comando e da Visual Studio, quindi non è necessario aggiungerlo manualmente.
L'assembly System.Data.dll
contiene gli spazi dei nomi seguenti, necessari per generare oggetti 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 .NET Framework (l'integrazione CLR di SQL Server non supporta .NET Core o .NET 5 e versioni successive). Inoltre, gli assembly CLR con il set di autorizzazioni EXTERNAL_ACCESS
o UNSAFE
non sono supportati in Linux.
Scrivere una stored procedure "Hello World"
Copiare e incollare il codice C# o Visual Basic .NET 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!";
}
}
Questo programma contiene un singolo metodo statico su una classe pubblica. Questo metodo usa due nuove classi, SqlContext e SqlPipe, per creare oggetti database gestiti e restituire un messaggio semplice. 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 di Transact-SQL.
Il programma verrà quindi generato come catalogo, caricato in SQL Server ed eseguito come stored procedure.
Generazione della stored procedure "Hello World"
Per impostazione predefinita, SQL Server installa i file di ridistribuzione di .NET Framework. Questi file includono csc.exe
e vbc.exe
, i compilatori della riga di comando per i programmi C# e Visual Basic .NET. Per generare il campione, è necessario modificare la variabile del percorso in modo che punti all’elenco contenente csc.exe
o vbc.exe
. Il percorso di installazione seguente è quello predefinito di .NET Framework.
C:\Windows\Microsoft.NET\Framework\(version)
Version contiene il numero di versione del .NET Framework installato. Ad esempio:
C:\Windows\Microsoft.NET\Framework\v4.8.0
Dopo aver aggiunto la directory del .NET Framework al tuo percorso, puoi compilare la stored procedure di esempio in un assembly usando il comando seguente. L'opzione /target
consente di compilare la stored procedure in un assembly.
Per i file di origine C#:
csc /target:library helloworld.cs
Per i file di origine .NET di Visual Basic:
vbc /target:library helloworld.vb
Questi comandi avviano il compilatore C# o Visual Basic .NET usando l'opzione /target
per specificare la compilazione di una DLL di libreria.
Caricamento ed esecuzione della stored procedure "Hello World" in SQL Server
Una volta compilata correttamente la procedura di esempio, è possibile testarla in SQL Server. A tale scopo, apri SQL Server Management Studio e creare una nuova query, connettendoti a un database di test appropriato (ad esempio il database di campionamento AdventureWorks2022
).
L'esecuzione di codice CLR (Common Language Runtime) in SQL Server è impostata per impostazione predefinita a OFF
. Il codice CLR può essere abilitato tramite la stored procedure sp_configure
di sistema. Per altre informazioni, vedere Abilitare l'integrazione con CLR.
È necessario creare l'assembly in modo da poter accedere alla procedura memorizzata. Per questo esempio si presuppone che sia stato creato l'assembly helloworld.dll
nella directory C:\
. Aggiungi l'istruzione Transact-SQL seguente alla query.
CREATE ASSEMBLY helloworld from 'C:\helloworld.dll' WITH PERMISSION_SET = SAFE
Dopo aver creato l'assembly, è ora possibile accedere al metodo HelloWorld usando l'istruzione CREATE PROCEDURE
. Chiamiamo la nostra procedura memorizzata hello
:
CREATE PROCEDURE hello
(@i NCHAR (25) OUTPUT)
AS EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld;
Nota
Nell'esempio precedente, se la classe HelloWorldProc
si trova all'interno di uno spazio dei nomi (denominato MyNS
), l'ultima riga nell'istruzione create procedure sarà EXTERNAL NAME helloworld.[MyNS.HelloWorldProc].HelloWorld;
.
Dopo aver creato la procedura, può essere eseguita esattamente come una normale stored procedure scritta in Transact-SQL. Eseguire il comando seguente:
DECLARE @J AS NCHAR (25);
EXECUTE hello @J OUTPUT;
PRINT @J;
Ecco l'output previsto.
Hello world!
Hello world!
Rimozione della stored procedure "Hello World" di campionamento
Al termine dell'esecuzione della stored procedure di campionamento, è 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 aver 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;