SQL Server在.NET 2.0框架上用C编写的存储过程,它有一个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”和“传递的空值”:
exec dbo.TestProc @TestInt = 1
exec dbo.TestProc @TestInt = null
但是,我的目标是为@testint分配一个默认的空值,这将允许我只执行以下命令:
exec dbo.TestProc
我找不到在.NET代码中为参数提供默认值的方法。通过谷歌搜索,我可以发现,.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中。