Standardparameterwerte / optionale Parameter für gespeicherte .NET-Prozeduren in SQL Server 2005

SQL Server Eine in C # geschriebene gespeicherte Prozedur im .NET 2.0-Framework mit einem SqlInt32-Parameter. Ich versuche, den Parameter optional zu machen. Hier ist ein minimaler Testfall, der nur die übergebene Ganzzahl ausgibt:

[Microsoft.SqlServer.Server.SqlProcedure]
public static void TestProc(
    SqlInt32 TestInt
    )
{
    SqlPipe pipe;
    pipe = SqlContext.Pipe;

    if (TestInt.IsNull)
    {
        pipe.Send("NULL value passed");
    }
    else
    {
        pipe.Send(TestInt.ToString());
    }
}

Diese Befehle werden wie erwartet ausgeführt und geben "1" bzw. "NULL-Wert übergeben" aus:

exec dbo.TestProc @TestInt = 1
exec dbo.TestProc @TestInt = null

Mein Ziel ist es jedoch, @TestInt den Standardwert NULL zuzuweisen, sodass ich nur diesen Befehl ausführen kann:

exec dbo.TestProc

Ich kann keine Möglichkeit finden, dem Parameter im .NET-Code einen Standardwert zuzuweisen. Von dem, was ich durch Googeln finden konnte, wird .NET 4.0 optionale Parameter unterstützen, so dass .NET 2.0 dies vermutlich nicht tut. Und eine (naive) Änderung der Parameterdeklaration wie folgt führt zu dem Fehler "Standardparameter-Spezifizierer sind nicht zulässig":

SqlInt32 TestInt = SqlInt32.Null

Ich habe auch versucht, die Methode durch Hinzufügen des folgenden Codes zu überladen:

public static void TestProc()
{
    SqlInt32 intNull;
    intNull = SqlInt32.Null;
    TestProc(intNull);
}

Dies wird sauber kompiliert, kann aber nicht bereitgestellt werden: VS zeigt den Fehler "Überladene Methoden, Eigenschaften oder Felder werden nicht unterstützt". An diesem Punkt stecke ich fest.

Der reale Anwendungsfall ist natürlich komplexer: Es ist ein TSQL-Protokollierungsmodul, das gespeicherte Prozeduren aufruft, um Protokollnachrichten zu verarbeiten. Die Verarbeitungsprozedur wird zur Laufzeit dynamisch identifiziert, und der aufrufende Code weiß nicht, ob er einen TSQL- oder .NET-Prozess aufruft. Das erfordert, dass alle Prozeduren dieselben Parameter unterstützen, und mehrere sind optional. Der aufrufende Code ist bereits in Produktion, daher versuche ich zu vermeiden, ihn so zu ändern, dass bei jedem Aufruf alle Parameter übergeben werden. In TSQL-Prozessen ist dies kein Problem, da optionale Parameter einfach sind, aber anscheinend nicht in .NET.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage