Значения параметров по умолчанию / необязательные параметры для хранимых процедур .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)

Решение Вопроса

Как вы указали, это потому, что C # 2.0 не поддерживает необязательные параметры.

Одним из обходных путей может быть оборачивание хранимых процедур .NET в обычные хранимые процедуры T-SQL, которые принимают параметры по умолчанию.

Например:

CREATE PROCEDURE TestProcWrapper
(
    @TestIntWrapperParam int = null
)
AS
EXEC TestProc @TestInt = @TestIntWrapperParam 

Это немного уродливо, но пока что может помочь вам.

 Pondlife03 июл. 2009 г., 10:32
Спасибо за отзыв. Я реализовал оболочку, как вы и предлагали. Я пытался избежать этого решения, потому что я не хочу создавать слишком много слоев процедур-оболочек. Однако без поддержки необязательных параметров в .NET, похоже, альтернативы нет. Это выглядит как неудачное «несоответствие импеданса». между TSQL, где необязательные параметры являются общими (по крайней мере, в моем коде), и .NET, где они даже не возможны (пока).

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