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