Domyślne wartości parametrów / opcjonalne parametry procedur przechowywanych .NET w SQL Server 2005

SQL Server procedura składowana napisana w języku C # na platformie .NET 2.0, która ma parametr SqlInt32. Próbuję ustawić parametr jako opcjonalny. Oto minimalny przypadek testowy, który właśnie drukuje przekazaną mu liczbę całkowitą:

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

Polecenia te wykonują się zgodnie z oczekiwaniami i wypisują odpowiednio „1” i „Wartość NULL”:

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

Jednak moim celem jest przypisanie domyślnej wartości NULL do @TestInt, co pozwoliłoby mi wykonać tylko to polecenie:

exec dbo.TestProc

Nie mogę znaleźć sposobu na podanie wartości domyślnej parametru w kodzie .NET. Z tego, co mogłem znaleźć w Googlingu, .NET 4.0 będzie obsługiwał opcjonalne parametry, więc prawdopodobnie .NET 2.0 nie. I (naiwnie) zmiana deklaracji parametrów w ten sposób daje błąd „domyślne specyfikatory parametrów nie są dozwolone”:

SqlInt32 TestInt = SqlInt32.Null

Próbowałem także przeładować metodę, dodając ten kod:

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

Kompiluje się to czysto, ale nie można go wdrożyć: VS pokazuje błąd „Przeciążone metody, właściwości lub pola nie są obsługiwane”. Więc w tym momencie utknąłem.

Rzeczywisty przypadek użycia jest oczywiście bardziej złożony: jest to moduł rejestrowania TSQL, który wywołuje procedury przechowywane w celu obsługi komunikatów dziennika. Procedura obsługi jest identyfikowana dynamicznie w czasie wykonywania, a kod wywołujący nie wie, czy wywołuje proc TSQL czy .NET. Wymaga to, aby wszystkie procedury obsługiwały te same parametry, a kilka jest opcjonalnych. Kod wywoławczy jest już w produkcji, więc staram się unikać jego zmiany, aby przekazywał każdy parametr przy każdym wywołaniu. W procesach TSQL nie jest to problemem, ponieważ opcjonalne parametry są łatwe, ale najwyraźniej nie w .NET.

questionAnswers(1)

yourAnswerToTheQuestion