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 hello
auf:
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:
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für