Freigeben über


Erste Schritte bei der CLR-Integration

Gilt für:SQL Server

Dieser Artikel enthält eine Übersicht über die Namespaces und Bibliotheken, die zum Kompilieren von Datenbankobjekten mithilfe der SQL Server-Integration in die Common Language Runtime (CLR) von .NET Framework erforderlich sind. Im Artikel wird auch gezeigt, wie Sie eine kleine gespeicherte CLR-Prozedur schreiben, kompilieren und ausführen, die in C# und Visual Basic .NET geschrieben wurde.

Erforderliche Namespaces

Die Komponenten, die zum Entwickeln grundlegender CLR-Datenbankobjekte erforderlich sind, werden mit SQL Server installiert. Die CLR-Integrationsfunktionalität ist in einer Assembly mit der Bezeichnung System.Data.dll enthalten, die Teil des .NET Framework ist. Diese Assembly befindet sich im globalen Assemblycache (GAC) und im .NET Framework-Verzeichnis. In der Regel wird ein Verweis auf diese Assembly durch Befehlszeilentools Visual Studio automatisch hinzugefügt und muss daher nicht manuell hinzugefügt werden.

Die System.Data.dll-Assembly enthält die folgenden Namespaces, die zum Kompilieren von CLR-Datenbankobjekten erforderlich sind:

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

Tipp

Das Laden von CLR-Datenbankobjekten unter Linux wird unterstützt, muss jedoch mit .NET Framework erstellt werden (SQL Server CLR-Integration unterstützt .NET Core oder .NET 5 und höhere Versionen nicht). Außerdem werden CLR-Assemblys mit dem Berechtigungssatz EXTERNAL_ACCESS oder UNSAFE unter Linux nicht unterstützt.

Schreiben einer gespeicherten "Hallo Welt"-Prozedur

Kopieren Sie den folgenden C#- oder Visual Basic .NET-Code in einen Text-Editor, und speichern Sie ihn in einer Datei mit dem Namen helloworld.cs oder 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!";
    }
}

Dieses Programm enthält eine einzelne statische Methode in einer öffentlichen Klasse. Diese Methode enthält die beiden neuen Klassen SqlContext und SqlPipe zum Erstellen von verwalteten Datenbankobjekten für die Ausgabe einer kurzen Textnachricht. Die Methode weist auch die Zeichenfolge "Hallo Welt!" als Wert eines out Parameters zu. Diese Methode kann als gespeicherte Prozedur in SQL Server deklariert und anschließend auf dieselbe Weise wie eine gespeicherte Transact-SQL-Prozedur ausgeführt werden.

Kompilieren Sie dieses Programm als Bibliothek, laden Sie es in SQL Server und führen Sie es als gespeicherte Prozedur aus.

Kompilieren der gespeicherten Prozedur "Hallo Welt"

SQL Server installiert standardmäßig die .NET Framework-Redistributionsdateien. Zu diesen Dateien gehören csc.exe und vbc.exe, die Befehlszeilencompiler für C#- und Visual Basic .NET-Programme. Zum Kompilieren des Beispiels müssen Sie die Pfadvariable so ändern, dass sie auf das Verzeichnis mit der Datei csc.exe oder vbc.exe zeigt. Der Standardinstallationspfad von .NET Framework lautet wie folgt.

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

Diese Version enthält die Versionsnummer der installierten Redistributionsdatei von .NET Framework. Zum Beispiel:

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

Nachdem Sie das .NET Framework-Verzeichnis zu Ihrem Pfad hinzugefügt haben, können Sie die gespeicherte Beispielprozedur mit dem folgenden Befehl in eine Assembly kompilieren. Mit der /target-Option können Sie sie in eine Assembly kompilieren.

Für C#-Quelldateien:

csc /target:library helloworld.cs

Für .NET-Quelldateien in Visual Basic:

vbc /target:library helloworld.vb

Mit diesen Befehlen wird der C#- oder Visual Basic .NET-Compiler mithilfe der /target-Option aufgerufen, um das Erstellen einer Bibliotheks-DLL anzugeben.

Laden und Ausführen der gespeicherten Prozedur "Hallo Welt" in SQL Server

Sobald die Beispielprozedur erfolgreich kompiliert wurde, können Sie sie in SQL Server testen. Öffnen Sie hierzu SQL Server Management Studio und erstellen Sie eine neue Abfrage zum Verbinden einer geeigneten Testdatenbank (z. B. der Beispieldatenbank AdventureWorks2022).

Die Funktion zum Ausführen von CLR-Code (Common Language Runtime) ist im SQL Server standardmäßig auf OFF gesetzt. Der CLR-Code kann mithilfe der sp_configure gespeicherten Systemprozedur aktiviert werden. Weitere Informationen finden Sie unter Aktivieren der CLR-Integration.

Wir müssen die Assembly erstellen, damit wir auf die gespeicherte Prozedur zugreifen können. In diesem Beispiel wird davon ausgegangen, dass Sie die helloworld.dll-Assembly im Verzeichnis C:\ erstellt haben. Fügen Sie die folgende Transact-SQL-Anweisung zur Abfrage hinzu.

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

Nachdem die Assembly erstellt wurde, können wir nun mithilfe der CREATE PROCEDURE-Anweisung auf unsere HelloWorld-Methode zugreifen. Wir rufen unsere gespeicherte Prozedur helloauf:

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

Anmerkung

Wenn sich die HelloWorldProc-Klasse im vorherigen Beispiel in einem Namespace namens MyNS befindet, würde die letzte Zeile in der CREATE PROCEDURE-Anweisung EXTERNAL NAME helloworld.[MyNS.HelloWorldProc].HelloWorld; lauten.

Nachdem die Prozedur erstellt wurde, kann sie genauso wie eine normale gespeicherte Prozedur ausgeführt werden, die in Transact-SQL geschrieben wurde. Führen Sie den folgenden Befehl aus:

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

Die erwartete Ausgabe sieht folgendermaßen aus.

Hello world!
Hello world!

Entfernen des Beispiels der gespeicherten Prozedur "Hallo Welt"

Wenn Sie die gespeicherte Beispielprozedur ausgeführt haben, können Sie die Prozedur und die Assembly aus der Testdatenbank entfernen.

Entfernen Sie zuerst die Prozedur. Verwenden Sie hierzu den drop procedure-Befehl.

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

Sobald die Prozedur gelöscht wurde, können Sie die Assembly entfernen, die den Beispielcode enthält.

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