Partager via


Procédure pas à pas : débogage d'une fonction table SQL CLR définie par l'utilisateur

Cette rubrique s'applique à :

Édition

Visual Basic

C#

C++

Web Developer

Express

La rubrique ne s'applique pas La rubrique ne s'applique pas La rubrique ne s'applique pas La rubrique ne s'applique pas

Standard

La rubrique ne s'applique pas La rubrique ne s'applique pas La rubrique ne s'applique pas La rubrique ne s'applique pas

Pro et Team

La rubrique s'applique La rubrique s'applique La rubrique s'applique La rubrique s'applique

Cet exemple explique comment déboguer une fonction table définie par l'utilisateur CLR SQL (Common Language Run-time) SQL Server.

Si, lorsque vous essayez de déboguer un objet CLR SQL, le message « Annulé par l'utilisateur » s'affiche, vous devez manuellement configurer à la fois l'ordinateur sur lequel vous exécutez Visual Studio et celui qui exécute SQL Server. Pour plus d'informations, consultez Comment : configurer vos ordinateurs pour activer le débogage Transact-SQL et CLR SQL.

Notes

Les boîtes de dialogue et les commandes de menu qui s'affichent peuvent être différentes de celles qui sont décrites dans l'aide, en fonction de vos paramètres actifs ou de l'édition utilisée. Pour modifier vos paramètres, choisissez Importation et exportation de paramètres dans le menu Outils. Pour plus d'informations, consultez Utilisation des paramètres.

Pour déboguer une fonction table définie par l'utilisateur SQL CLR

  1. Dans un nouveau projet CLR SQL, établissez une connexion à une base de données. Pour plus d'informations, consultez How to: Connect to a Database.

  2. Créez une fonction à l'aide du code provenant de la première section d'exemple ci-dessous et nommez-la TableOfPrimes.cs. Pour plus d'informations, consultez How to: Develop with the SQL Server Project Type.

  3. Ajoutez un script qui teste la fonction en l'incluant dans une instruction SELECT. Dans l'Explorateur de solutions, cliquez avec le bouton droit sur le répertoire TestScripts, cliquez sur Ajouter un script de test et insérez le code de la deuxième section d'exemple ci-dessous. Enregistrez le fichier sous le nom TestPrime.sql. Cliquez avec le bouton droit sur le nom du fichier et cliquez sur Définir comme script de débogage par défaut.

  4. Définissez des points d'arrêt dans TableOfPrimes.cs, puis dans le menu Déboguer, cliquez sur Démarrer pour compiler, déployer et effectuer un test unitaire sur le projet. Lorsque le pointeur d'instruction, désigné par une flèche jaune, apparaît sur le point d'arrêt, cela signifie que vous êtes en train de déboguer le code CLR SQL.

  5. Testez différentes fonctionnalités de débogage.

    1. Dans le menu Déboguer, cliquez à plusieurs reprises sur Pas à pas détaillé pour observer l'exécution ligne par ligne de la fonction.

    2. Au fur et à mesure que vous exécutez la fonction pas à pas, vous pouvez utiliser les fenêtres Variables locales et Espion pour observer les valeurs de différents membres.

    3. Cliquez de nouveau sur Continuer pour terminer de déboguer la fonction.

    4. Dans la fenêtre Sortie, sélectionnez Sortie de base de données dans la liste déroulante Afficher la sortie à partir de. Vous pouvez observer les résultats de l'exécution des deux requêtes dans le script TestPrimes.sql.

Exemple

C'est le code qui lit le Journal des événements.

using System;
using System.Data;
using System.Data.Sql;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Collections;

public partial class UserDefinedFunctions
{
    struct primeIndex
    {
        public int n;
        public int p;
        public primeIndex(int n, int p)  
        { 
            this.n = n; this.p = p;
        }
    }

    static bool isPrime(int p)
    {
        if (p < 2) return false;
        if (p == 2) return true;
        if (p % 2 == 0) return false;
        for (int d = 3; d * d <= p; d+=2)
        {
            if (p % d == 0) return false;
        }
        return true;
    }

    static int nextPrime(int p)
    {
        int result = p + 1;
        while (!isPrime(result)) result++;
        return result;
    }

    [SqlFunction(FillRowMethodName = "Fill", TableDefinition = "n int,p int,est float")]
    public static IEnumerable TableOfPrimes(int n)
    {
        int p = 1;
        for (int i = 1; i <= n; i++)
        {
            p = nextPrime(p);
            yield return new primeIndex(i, p);
        }
    }

    private static void Fill(object source, out int n, out int p, out SqlDouble est)
    {
        primeIndex pi = (primeIndex)source;
        n = pi.n;
        p = pi.p;
        if (n <5)
            est = SqlDouble.Null;
        else
        {
            double log = Math.Log(n);
            double loglog = Math.Log(log);
            est = n * (log + loglog - 1 + loglog / log - 2 / log); 
        }
    }
}

Voici le script de test qui appelle la fonction.

SELECT n,p,est FROM dbo.TableOfPrimes(50)

SELECT TOP 10 n, p, est, est/p AS factor FROM dbo.TableOfPrimes(500) ORDER BY factor DESC

SELECT TOP 10 n, p, est, est/p AS factor FROM dbo.TableOfPrimes(1000) WHERE n>500 ORDER BY factor DESC

Voir aussi

Tâches

Comment : créer et exécuter une fonction définie par l'utilisateur SQL Server à l'aide de l'intégration du Common Language Runtime