Значения параметров по умолчанию / необязательные параметры для хранимых процедур .NET в SQL Server 2005

SQL Server - это хранимая процедура, написанная на C # в платформе .NET 2.0 с параметром SqlInt32. Я пытаюсь сделать параметр необязательным. Вот минимальный тестовый пример, который просто печатает переданное ему целое число:

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

Эти команды выполняются, как и ожидалось, и выводят «1» и «переданное значение NULL» соответственно:

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

Однако моя цель состоит в том, чтобы назначить значение по умолчанию NULL для @TestInt, что позволило бы мне выполнить только эту команду:

exec dbo.TestProc

Я не могу найти способ предоставить значение по умолчанию для параметра в .NET-коде. Из того, что я мог найти с помощью Google, .NET 4.0 будет поддерживать необязательные параметры, поэтому, предположительно, .NET 2.0 нет. И (наивно) изменение объявления параметра таким образом приводит к ошибке «Спецификаторы параметров по умолчанию недопустимы»:

SqlInt32 TestInt = SqlInt32.Null

Я также попытался перегрузить метод, добавив этот код:

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

Это компилируется чисто, но не может быть развернуто: VS показывает ошибку "Перегруженные методы, свойства или поля не поддерживаются". Так что в этот момент я застрял.

Реальный вариант использования, конечно, более сложный: это модуль ведения журнала TSQL, который вызывает хранимые процедуры для обработки сообщений журнала. Процедура обработки идентифицируется динамически во время выполнения, и вызывающий код не знает, вызывает ли он вызов TSQL или .NET. Это требует, чтобы все процедуры поддерживали одни и те же параметры, а некоторые являются необязательными. Код вызова уже находится в производстве, поэтому я стараюсь не изменять его, чтобы он передавал каждый параметр в каждом вызове. В процессах TSQL это не проблема, так как необязательные параметры просты, но, очевидно, не в .NET.

Ответы на вопрос(1)

Ваш ответ на вопрос