Kom igång med CLR-integrering
gäller för:SQL Server
Den här artikeln innehåller en översikt över de namnområden och bibliotek som krävs för att kompilera databasobjekt med hjälp av SQL Server-integreringen med .NET Framework common language runtime (CLR). Artikeln visar också hur du skriver, kompilerar och kör en liten CLR-lagrad procedur skriven i C# och Visual Basic .NET.
Obligatoriska namnområden
De komponenter som krävs för att utveckla grundläggande CLR-databasobjekt installeras med SQL Server. CLR-integreringsfunktioner exponeras i en sammansättning som kallas System.Data.dll
, som är en del av .NET Framework. Den här sammansättningen finns i Global Assembly Cache (GAC) och i katalogen .NET Framework. Normalt läggs en referens till den här sammansättningen automatiskt av både kommandoradsverktygen och Visual Studio, så du behöver inte lägga till den manuellt.
Den System.Data.dll
sammansättningen innehåller följande namnområden som krävs för kompilering av CLR-databasobjekt:
System.Data
System.Data.Sql
Microsoft.SqlServer.Server
System.Data.SqlTypes
Tips
Inläsning av CLR-databasobjekt i Linux stöds, men de måste skapas med .NET Framework (SQL Server CLR-integrering stöder inte .NET Core eller .NET 5 och senare versioner). CLR-sammansättningar med behörighetsuppsättningen EXTERNAL_ACCESS
eller UNSAFE
stöds inte i Linux.
Skriva en lagrad "Hello World"-procedur
Kopiera och klistra in följande C# eller Visual Basic .NET-kod i en textredigerare och spara den i en fil med namnet helloworld.cs
eller 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!";
}
}
Det här programmet innehåller en enda statisk metod i en offentlig klass. Den här metoden använder två nya klasser, SqlContext och SqlPipe, för att skapa hanterade databasobjekt för att mata ut ett kort textmeddelande. Metoden tilldelar också strängen "Hello world!" som värdet för en out
parameter. Den här metoden kan deklareras som en lagrad procedur i SQL Server och sedan köras på samma sätt som en Transact-SQL lagrad procedur.
Kompilera det här programmet som ett bibliotek, läs in det i SQL Server och kör det som en lagrad procedur.
Kompilera den lagrade proceduren "Hello World"
SQL Server installerar omdistributionsfilerna för .NET Framework som standard. Dessa filer omfattar csc.exe
och vbc.exe
, kommandoradskompilatorer för C# och Visual Basic .NET-program. För att kunna kompilera vårt exempel måste du ändra sökvägsvariabeln så att den pekar på katalogen som innehåller csc.exe
eller vbc.exe
. Följande sökväg är standardinstallationssökvägen för .NET Framework.
C:\Windows\Microsoft.NET\Framework\(version)
Versionen innehåller versionsnumret för det installerade .NET Framework. Till exempel:
C:\Windows\Microsoft.NET\Framework\v4.8.0
När du har lagt till .NET Framework-katalogen i sökvägen kan du kompilera den lagrade exempelproceduren till en sammansättning med följande kommando. Med alternativet /target
kan du kompilera den till en sammansättning.
För C#-källfiler:
csc /target:library helloworld.cs
För Visual Basic .NET-källfiler:
vbc /target:library helloworld.vb
Dessa kommandon startar C# eller Visual Basic .NET-kompilatorn med hjälp av alternativet /target
för att ange hur du skapar en biblioteks-DLL.
Läs in och kör den lagrade proceduren "Hello World" i SQL Server
När exempelproceduren har kompilerats kan du testa den i SQL Server. Det gör du genom att öppna SQL Server Management Studio och skapa en ny fråga som ansluter till en lämplig testdatabas (till exempel AdventureWorks2022
exempeldatabas).
Möjligheten att köra CLR-kod (Common Language Runtime) är inställd på OFF
som standard i SQL Server. CLR-koden kan aktiveras med hjälp av systemlagringsproceduren sp_configure
. Mer information finns i Aktivera CLR-integrering.
Vi måste skapa sammansättningen så att vi kan komma åt den lagrade proceduren. I det här exemplet förutsätter vi att du har skapat helloworld.dll
-sammansättningen i katalogen C:\
. Lägg till följande Transact-SQL-instruktion i din sökfråga.
CREATE ASSEMBLY helloworld from 'C:\helloworld.dll' WITH PERMISSION_SET = SAFE
När sammansättningen har skapats kan vi nu komma åt vår HelloWorld-metod med hjälp av instruktionen CREATE PROCEDURE
. Vi anropar vår lagrade procedur hello
:
CREATE PROCEDURE hello
(@i NCHAR (25) OUTPUT)
AS EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld;
Notera
Om klassen HelloWorldProc
i föregående exempel finns i ett namnområde (kallas MyNS
) skulle den sista raden i instruktionen skapa procedur vara EXTERNAL NAME helloworld.[MyNS.HelloWorldProc].HelloWorld;
.
När proceduren har skapats kan den köras precis som en normal lagrad procedur som skrivits i Transact-SQL. Kör följande kommando:
DECLARE @J AS NCHAR (25);
EXECUTE hello @J OUTPUT;
PRINT @J;
Här är de förväntade resultaten.
Hello world!
Hello world!
Ta bort det lagrade procedurexemplet "Hello World"
När du är klar med den lagrade exempelproceduren kan du ta bort proceduren och sammansättningen från testdatabasen.
Ta först bort proceduren med kommandot släppprocedur.
IF EXISTS (SELECT name
FROM sysobjects
WHERE name = 'hello')
DROP PROCEDURE hello;
När proceduren har tagits bort kan du ta bort sammansättningen som innehåller exempelkoden.
IF EXISTS (SELECT name
FROM sys.assemblies
WHERE name = 'helloworld')
DROP ASSEMBLY helloworld;