Prise en main de l’intégration du CLR

S’applique à :SQL Server

Cet article fournit une vue d’ensemble des espaces de noms et des bibliothèques nécessaires pour compiler des objets de base de données à l’aide de l’intégration de Microsoft SQL Server au Common Language Runtime (CLR) du .NET Framework. L’article vous montre également comment écrire, compiler et exécuter une petite procédure stockée CLR écrite dans Microsoft Visual C# et Visual Basic.

Espaces de noms requis

Les composants requis pour développer des objets de base de base de données CLR sont installés avec SQL Server. La fonctionnalité d’intégration CLR est exposée dans un assembly appelé System.Data.dll, qui fait partie du .NET Framework. Cet assembly se trouve dans le Global Assembly Cache (GAC), ainsi que dans le répertoire .NET Framework. Une référence à cet assembly est généralement ajoutée automatiquement par les outils en ligne de commande et Microsoft Visual Studio. Il n’est donc pas nécessaire de l’ajouter manuellement.

L’assembly System.Data.dll contient les espaces de noms suivants, requis pour la compilation d’objets de base de données CLR :

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

Astuce

Le chargement d’objets de base de données CLR sur Linux est pris en charge, mais ils doivent être générés avec .NET Framework (l’intégration du CLR SQL Server ne prend pas en charge .NET Core, ou .NET 5 et versions ultérieures). En outre, les assemblys CLR avec le jeu d’autorisations ou UNSAFE le EXTERNAL_ACCESS jeu d’autorisations ne sont pas pris en charge sur Linux.

Écrire une procédure stockée « Hello World »

Copiez et collez le code Visual C# ou Visual Basic suivant dans un éditeur de texte, puis enregistrez-le dans un fichier nommé helloworld.cs ou 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!";
    }
}

Ce programme contient une méthode statique unique sur une classe publique. Cette méthode utilise deux nouvelles classes, SqlContext et SqlPipe, pour créer des objets de base de données managés pour générer un message texte court. La méthode affecte également la chaîne « Hello world! » comme valeur d’un out paramètre. Cette méthode peut être déclarée en tant que procédure stockée dans SQL Server, puis s’exécuter de la même manière qu’une procédure stockée Transact-SQL.

Compilez ce programme en tant que bibliothèque, chargez-le dans SQL Server et exécutez-le en tant que procédure stockée.

Compiler la procédure stockée « Hello World »

SQL Server installe les fichiers de redistribution .NET Framework par défaut. Ces fichiers incluent csc.exe et vbc.exe, les compilateurs de ligne de commande pour les programmes Visual C# et Visual Basic. Pour compiler notre exemple, vous devez modifier votre variable de chemin d’accès pour qu’elle pointe vers le répertoire contenant csc.exe ou vbc.exe. Le chemin d’accès suivant est le chemin d’installation par défaut du .NET Framework.

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

La version contient le numéro de version du .NET Framework installé. Par exemple :

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

Une fois que vous avez ajouté le répertoire .NET Framework à votre chemin d’accès, vous pouvez compiler l’exemple de procédure stockée dans un assembly avec la commande suivante. L'option /target vous permet de le compiler en assembly.

Pour les fichiers sources Visual C# :

csc /target:library helloworld.cs

Pour les fichiers sources Visual Basic :

vbc /target:library helloworld.vb

Ces commandes lancent le compilateur Visual C# ou Visual Basic en utilisant l'option /target pour spécifier la génération d'une DLL de bibliothèque.

Charger et exécuter la procédure stockée « Hello World » dans SQL Server

Une fois l’exemple de procédure compilé, vous pouvez le tester dans SQL Server. Pour ce faire, ouvrez SQL Server Management Studio et créez une requête, en vous connectant à une base de données de test appropriée (par exemple, l’exemple AdventureWorks de base de données).

La possibilité d’exécuter du code CLR (Common Language Runtime) est définie OFF par défaut dans SQL Server. Le code CLR peut être activé à l’aide de la sp_configure procédure stockée système. Pour plus d’informations, consultez Activation de l’intégration du CLR.

Nous devons créer l’assembly pour pouvoir accéder à la procédure stockée. Pour cet exemple, nous partons du principe que vous avez créé l’assembly helloworld.dll dans le C:\ répertoire. Ajoutez l’instruction Transact-SQL suivante à votre requête.

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

Une fois l'assembly créé, il est possible d'accéder à la méthode HelloWorld en utilisant l'instruction CREATE PROCEDURE. Nous allons appeler notre procédure hellostockée :

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

Une fois la procédure créée, elle peut être exécutée comme une procédure stockée normale écrite dans Transact-SQL. Exécutez la commande suivante :

DECLARE @J NCHAR(25);
EXEC hello @J out;
PRINT @J;

Cela doit entraîner la sortie suivante dans la fenêtre de messages SQL Server Management Studio.

Hello world!
Hello world!

Supprimer l’exemple de procédure stockée « Hello World »

Lorsque vous avez terminé d’exécuter l’exemple de procédure stockée, vous pouvez supprimer la procédure et l’assembly de votre base de données de test.

En premier lieu, supprimez la procédure à l'aide de la commande drop procedure.

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

Une fois la procédure supprimée, vous pouvez supprimer l'assembly qui contient votre exemple de code.

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

Étapes suivantes

Pour plus d’informations sur l’intégration du CLR dans SQL Server, consultez les articles suivants :