Erste Schritte mit 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 Microsoft SQL Server-Integration in die Common Language Runtime (CLR) von .NET Framework erforderlich sind. Im Artikel wird auch gezeigt, wie Sie eine kleine clR-gespeicherte Prozedur schreiben, kompilieren und ausführen, die in Microsoft Visual C# und Visual Basic geschrieben wurde.

Erforderliche Namespaces

Die komponenten, die zum Entwickeln grundlegender CLR-Datenbankobjekte erforderlich sind, werden mit SQL Server installiert. CLR-Integrationsfunktionen werden in einer Assembly mit dem Namen System.Data.dll.NET Framework verfügbar gemacht. Diese Assembly befindet sich im globalen Assemblycache (GAC) sowie im .NET Framework-Verzeichnis. Ein Verweis auf diese Assembly wird in der Regel automatisch von Befehlszeilentools und Microsoft Visual Studio hinzugefügt, sodass es nicht manuell hinzugefügt werden muss.

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 EXTERNAL_ACCESS Oder UNSAFE Berechtigungssatz unter Linux nicht unterstützt.

Schreiben einer gespeicherten "Hello World"-Prozedur

Kopieren Sie den folgenden Visual C#- oder Visual Basic-Code, und fügen Sie ihn in einen Text-Editor ein, und speichern Sie ihn in einer Datei namens 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 für eine öffentliche Klasse. Diese Methode verwendet zwei neue Klassen, SqlContext und SqlPipe, um verwaltete Datenbankobjekte zu erstellen, um eine kurze Textnachricht auszugeben. Die Methode weist auch die Zeichenfolge "Hello world!" als Wert eines out Parameters zu. Diese Methode kann als gespeicherte Prozedur in SQL Server deklariert und dann auf die gleiche 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 "Hello World"

SQL Server installiert standardmäßig die .NET Framework-Umverteilungsdateien. Diese Dateien enthalten csc.exe und vbc.exe, die Befehlszeilencompiler für Visual C#- und Visual Basic-Programme. Um unser Beispiel zu kompilieren, müssen Sie Ihre Pfadvariable so ändern, dass sie auf das Verzeichnis verweist, das enthält csc.exe oder vbc.exe. Der folgende Pfad ist der Standardinstallationspfad von .NET Framework.

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

Die Version enthält die Versionsnummer des installierten .NET Frameworks. 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 Visual C#-Quelldateien gilt:

csc /target:library helloworld.cs

Für Visual Basic-Quelldateien gilt:

vbc /target:library helloworld.vb

Mit diesen Befehlen wird der Visual C# - bzw. Visual Basic-Compiler unter Angabe der /target-Option aufgerufen, die festlegt, dass eine Bibliotheks-DLL erstellt werden soll.

Laden und Ausführen der gespeicherten Prozedur "Hello World" in SQL Server

Nachdem die Beispielprozedur erfolgreich kompiliert wurde, können Sie sie in SQL Server testen. Öffnen Sie dazu SQL Server Management Studio, und erstellen Sie eine neue Abfrage, die eine Verbindung mit einer geeigneten Testdatenbank herstellt (z. B. die AdventureWorks Beispieldatenbank).

Die Möglichkeit zum Ausführen von CLR-Code (Common Language Runtime) ist standardmäßig in SQL Server festgelegt OFF . Der CLR-Code kann mithilfe der sp_configure gespeicherten Systemprozedur aktiviert werden. Weitere Informationen finden Sie unter Enabling 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 C:\ Verzeichnis erstellt haben. Fügen Sie Ihrer Abfrage die folgende Transact-SQL-Anweisung hinzu.

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

Nach dem Erstellen der Assembly können Sie mithilfe der CREATE PROCEDURE-Anweisung auf die HelloWorld-Methode zugreifen. Wir rufen unsere gespeicherte Prozedur helloauf:

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

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 NCHAR(25);
EXEC hello @J out;
PRINT @J;

Dies sollte zu der folgenden Ausgabe im Sql Server Management Studio-Nachrichtenfenster führen.

Hello world!
Hello world!

Entfernen des Gespeicherten Prozedurbeispiels "Hello World"

Wenn Sie mit der Ausführung der gespeicherten Beispielprozedur fertig sind, 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;

Nach dem Löschen der Prozedur können Sie die Assembly entfernen, die den Beispielcode enthält.

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

Nächste Schritte

Weitere Informationen zur CLR-Integration in SQL Server finden Sie in den folgenden Artikeln: