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

Mise à jour : novembre 2007

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

Légende du tableau :

La rubrique s'applique

Applicable

La rubrique ne s'applique pas

Non applicable

La rubrique s'applique mais la commande est masquée par défaut

Commande ou commandes masquées par défaut.

Cet exemple montre comment déboguer une fonction table définie par l'utilisateur (UDF) CLR SQL.

Remarque :

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 Paramètres Visual Studio.

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

  1. Dans un nouveau projet SQL Server, établissez une connexion à une base de données. Pour plus d'informations, consultez Comment : se connecter à une base de données.

  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 Comment : développer avec le type de projet SQL Server.

  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 cliquez dans le menu Déboguer 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, dans la liste déroulante Afficher la sortie à partir de, sélectionnez Sortie de base de données. 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 CLR

Autres ressources

Débogage d'une base de données SQL CLR