Exemplarische Vorgehensweise: Debuggen einer benutzerdefinierten SQL/CLR-Tabellenwertfunktion

Aktualisiert: November 2007

Dieses Thema gilt für folgende Anwendungsbereiche:

Edition

Visual Basic

C#

C++

Web Developer

Express

Standard

Pro und Team

Tabellenlegende:

Vorhanden

Nicht vorhanden

Befehl oder Befehle, die standardmäßig ausgeblendet sind.

In diesem Beispiel wird veranschaulicht, wie eine SQL/CLR-UDF (benutzerdefinierte SQL/CLR-Tabellenwertfunktion) gedebuggt wird.

Hinweis:

Je nach den aktiven Einstellungen oder der verwendeten Version können sich die angezeigten Dialogfelder und Menübefehle von den in der Hilfe beschriebenen unterscheiden. Klicken Sie im Menü Extras auf Einstellungen importieren und exportieren, um die Einstellungen zu ändern. Weitere Informationen finden Sie unter Visual Studio-Einstellungen.

So debuggen Sie eine benutzerdefinierte SQL/CLR-Tabellenwertfunktion

  1. Stellen Sie in einem neuen SQL Server-Projekt eine Verbindung mit einer Datenbank her. Weitere Informationen finden Sie unter Gewusst wie: Herstellen einer Verbindung zu einer Datenbank.

  2. Erstellen Sie mit dem Code aus dem ersten Beispielabschnitt unten eine neue Funktion, und nennen Sie sie TableOfPrimes.cs. Weitere Informationen finden Sie unter Gewusst wie: Entwickeln mit dem SQL Server-Projekttyp.

  3. Fügen Sie ein Skript hinzu, das die Funktion durch Aufrufen mittels einer SELECT-Anweisung testet. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Verzeichnis TestScripts, klicken Sie auf Testskript hinzufügen, und fügen Sie den Code aus dem zweiten der folgenden Beispielabschnitte ein. Speichern Sie die Datei unter dem Namen TestPrime.sql. Klicken Sie mit der rechten Maustaste auf den Dateinamen, und klicken Sie auf Als Standardskript zum Debuggen festlegen.

  4. Legen Sie in TableOfPrimes.cs Haltepunkte fest, und klicken Sie dann im Menü Debuggen auf Start, um das Projekt zu kompilieren, bereitzustellen und einem Komponententest zu unterziehen. Wenn der durch einen gelben Pfeil gekennzeichnete Anweisungszeiger an einem Haltepunkt angezeigt wird, debuggen Sie den SQL/CLR-Code.

  5. Testen Sie verschiedene Debugfeatures.

    1. Klicken Sie im Menü Debuggen wiederholt auf Einzelschritt, um die zeilenweise Ausführung der Funktion zu beobachten.

    2. Beim schrittweisen Durchlaufen der Funktion können die Werte verschiedener Member in den Fenstern Lokal und Überwachen beobachtet werden.

    3. Klicken Sie nochmals auf Weiter, um das Debuggen der Funktion abzuschließen.

    4. Wählen Sie im Fenster Ausgabe in der Dropdownliste Ausgabe anzeigen von die Option Datenbankausgabe aus. Nun können Sie die Ergebnisausgabe der beiden Abfragen im Skript TestPrimes.sql beobachten.

Beispiel

Dies ist der Code, der das Ereignisprotokoll liest.

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); 
        }
    }
}

Dies ist das Testskript, das die Funktion aufruft.

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

Siehe auch

Aufgaben

Gewusst wie: Erstellen und Ausführen einer benutzerdefinierten CLR SQL Server-Funktion

Weitere Ressourcen

Debuggen von SQL CLR-Datenbanken