Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo argomento offre una panoramica degli spazi dei nomi e delle librerie necessari per compilare oggetti di database usando l'integrazione di SQL Server con Common Language Runtime (CLR) di .NET Framework. L'argomento illustra anche come scrivere, compilare ed eseguire una semplice stored procedure CLR scritta in Microsoft Visual C#.
Spazi dei nomi obbligatori
A partire da 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 nella Global Assembly Cache (GAC) e nella directory .NET Framework. Un riferimento a questo assembly viene in genere aggiunto automaticamente sia dagli strumenti da riga di comando che da Microsoft Visual Studio, quindi 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 semplice stored procedure "Hello World"
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 in una classe pubblica. Questo metodo usa due nuove classi e SqlContextSqlPipe, per la creazione di oggetti di database gestiti per restituire 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 Transact-SQL stored procedure.
Il programma verrà compilato come libreria, caricato in SQL Server ed eseguito come stored procedure.
Compilazione della stored procedure "Hello World"
Per impostazione predefinita, i file di ridistribuzione di Microsoft .NET Framework. Questi file includono csc.exe e vbc.exe, i compilatori della riga di comando per i programmi Visual C# e Visual Basic. Per compilare l'esempio, è necessario modificare la variabile di percorso in modo che punti alla directory contenente csc.exe o vbc.exe. Di seguito è riportato il percorso di installazione predefinito di .NET Framework.
C:\Windows\Microsoft.NET\Framework\(version)
La versione contiene il numero di versione di .NET Framework ridistribuibile installato. Per esempio:
C:\Windows\Microsoft.NET\Framework\v2.0.31113
Dopo aver aggiunto la directory .NET Framework al percorso, è possibile compilare la stored procedure di esempio in un assembly con il comando seguente. 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 avviano il compilatore Visual C# o Visual Basic usando l'opzione /target per specificare la compilazione di una DLL di libreria.
Caricamento ed esecuzione della stored procedure "Hello World" in SQL Server
Dopo aver compilato correttamente la procedura di esempio, è possibile testarla in SQL Server Management Studio e creare una nuova query, connettendosi a un database di test appropriato, ad esempio il database di esempio AdventureWorks.
La possibilità di eseguire codice CLR (Common Language Runtime) è impostata su OFF per impostazione predefinita in SQL Server. Il codice CLR può essere abilitato usando la stored procedure di sistema sp_configure . Per altre informazioni, vedere Enabling CLR Integration.
Sarà necessario creare l'assembly in modo da poter accedere alla stored procedure. 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. Verrà chiamata la stored procedure "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
Dopo aver creato la procedura, può essere eseguita esattamente come una normale stored procedure scritta in Transact-SQL. Eseguire il comando seguente:
DECLARE @J nchar(25)
EXEC hello @J out
PRINT @J
Questo dovrebbe comportare l'output seguente nella finestra messaggi di SQL Server Management Studio.
Hello world!
Hello world!
Rimozione dell'esempio di stored procedure "Hello World"
Al termine dell'esecuzione della stored procedure di esempio, è possibile rimuovere la routine 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
Vedere anche
Procedure memorizzate CLR
SQL Server In-Process estensioni specifiche da ADO.NET
Debug di oggetti di database CLR
Sicurezza per l'integrazione con CLR