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
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.
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.
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.
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.
Testen Sie verschiedene Debugfeatures.
Klicken Sie im Menü Debuggen wiederholt auf Einzelschritt, um die zeilenweise Ausführung der Funktion zu beobachten.
Beim schrittweisen Durchlaufen der Funktion können die Werte verschiedener Member in den Fenstern Lokal und Überwachen beobachtet werden.
Klicken Sie nochmals auf Weiter, um das Debuggen der Funktion abzuschließen.
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