Delen via


Aan de slag met CLR-integratie

van toepassing op:SQL Server-

Dit artikel bevat een overzicht van de naamruimten en bibliotheken die nodig zijn voor het compileren van databaseobjecten met behulp van de SQL Server-integratie met de .NET Framework Common Language Runtime (CLR). In het artikel wordt ook beschreven hoe u een kleine CLR-opgeslagen procedure schrijft, compileert en uitvoert die is geschreven in C# en Visual Basic .NET.

Vereiste naamruimten

De onderdelen die nodig zijn om basis-CLR-databaseobjecten te ontwikkelen, worden geïnstalleerd met SQL Server. CLR-integratiefunctionaliteit wordt weergegeven in een assembly met de naam System.Data.dll, die deel uitmaakt van .NET Framework. Deze assembly vindt u in de Global Assembly Cache (GAC) en in de map .NET Framework. Normaal gesproken wordt automatisch een verwijzing naar deze assembly toegevoegd door zowel opdrachtregelprogramma's als Visual Studio, dus u hoeft deze niet handmatig toe te voegen.

De System.Data.dll assembly bevat de volgende naamruimten, die vereist zijn voor het compileren van CLR-databaseobjecten:

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

Tip

Het laden van CLR-databaseobjecten op Linux wordt ondersteund, maar ze moeten worden gebouwd met .NET Framework (SQL Server CLR-integratie biedt geen ondersteuning voor .NET Core of .NET 5 en latere versies). Clr-assembly's met de EXTERNAL_ACCESS of UNSAFE machtigingenset worden ook niet ondersteund in Linux.

Een opgeslagen 'Hallo wereld'-procedure schrijven

Kopieer en plak de volgende C# of Visual Basic .NET-code in een teksteditor en sla deze op in een bestand met de naam helloworld.cs of 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!";
    }
}

Dit programma bevat één statische methode in een openbare klasse. Deze methode maakt gebruik van twee nieuwe klassen, SqlContext en SqlPipe, voor het maken van beheerde databaseobjecten om een kort tekstbericht uit te voeren. Met de methode wordt ook de tekenreeks "Hello world!" toegewezen als de waarde van een out parameter. Deze methode kan worden gedeclareerd als een opgeslagen procedure in SQL Server en vervolgens op dezelfde manier worden uitgevoerd als een Transact-SQL opgeslagen procedure.

Compileer dit programma als een bibliotheek, laad het in SQL Server en voer het uit als een opgeslagen procedure.

De opgeslagen procedure 'Hallo wereld' compileren

SQL Server installeert standaard de herdistributiebestanden van .NET Framework. Deze bestanden omvatten csc.exe en vbc.exe, de opdrachtregelcompilers voor C# en Visual Basic .NET-programma's. Als u ons voorbeeld wilt compileren, moet u de padvariabele wijzigen zodat deze verwijst naar de map die csc.exe of vbc.exebevat. Het volgende pad is het standaardinstallatiepad van .NET Framework.

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

Versie bevat het versienummer van het geïnstalleerde .NET Framework. Bijvoorbeeld:

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

Zodra u de .NET Framework-map aan uw pad hebt toegevoegd, kunt u de opgeslagen voorbeeldprocedure compileren in een assembly met de volgende opdracht. Met de optie /target kunt u deze compileren in een assembly.

Voor C#-bronbestanden:

csc /target:library helloworld.cs

Voor Visual Basic .NET-bronbestanden:

vbc /target:library helloworld.vb

Met deze opdrachten start u de C# of Visual Basic .NET-compiler met behulp van de optie /target om het bouwen van een bibliotheek-DLL op te geven.

De opgeslagen 'Hallo wereld'-procedure laden en uitvoeren in SQL Server

Zodra de voorbeeldprocedure is gecompileerd, kunt u deze testen in SQL Server. Hiervoor opent u SQL Server Management Studio en maakt u een nieuwe query en maakt u verbinding met een geschikte testdatabase (bijvoorbeeld de AdventureWorks2022 voorbeelddatabase).

De mogelijkheid om CLR-code (Common Language Runtime) uit te voeren, is standaard ingesteld op OFF in SQL Server. De CLR-code kan worden ingeschakeld met behulp van de sp_configure systeem opgeslagen procedure. Zie CLR-integratie inschakelenvoor meer informatie.

We moeten de assembly maken zodat we toegang hebben tot de opgeslagen procedure. In dit voorbeeld wordt ervan uitgegaan dat u de helloworld.dll assembly hebt gemaakt in de map C:\. Voeg de volgende Transact-SQL-verklaring toe aan uw query.

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

Zodra de assembly is gemaakt, hebben we nu toegang tot onze HelloWorld-methode met behulp van de instructie CREATE PROCEDURE. We noemen onze opgeslagen procedure hello:

CREATE PROCEDURE hello
(@i NCHAR (25) OUTPUT)
AS EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld;

Notitie

Als in het vorige voorbeeld de klasse HelloWorldProc zich in een naamruimte bevindt (MyNSgenoemd), wordt de laatste regel in de instructie procedure maken EXTERNAL NAME helloworld.[MyNS.HelloWorldProc].HelloWorld;.

Zodra de procedure is gemaakt, kan deze worden uitgevoerd zoals een normale opgeslagen procedure die is geschreven in Transact-SQL. Voer de volgende opdracht uit:

DECLARE @J AS NCHAR (25);
EXECUTE hello @J OUTPUT;
PRINT @J;

Dit is de verwachte uitvoer.

Hello world!
Hello world!

Het voorbeeld van de opgeslagen procedure 'Hallo wereld' verwijderen

Wanneer u klaar bent met het uitvoeren van de opgeslagen voorbeeldprocedure, kunt u de procedure en de assembly verwijderen uit uw testdatabase.

Verwijder eerst de procedure met de DROP PROCEDURE-opdracht.

IF EXISTS (SELECT name
           FROM sysobjects
           WHERE name = 'hello')
    DROP PROCEDURE hello;

Zodra de procedure is verwijderd, kunt u de assembly met uw voorbeeldcode verwijderen.

IF EXISTS (SELECT name
           FROM sys.assemblies
           WHERE name = 'helloworld')
    DROP ASSEMBLY helloworld;