SQL Server在具有SqlInt32参数的.NET 2.0框架中用C#编写的存储过程。我试图使参数可选。这里是一个最小的测试情况下只是打印传递给它的整数:SQL Server 2005中.NET存储过程的默认参数值/可选参数
[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中的参数码。从我可以通过谷歌搜索得到的,.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 procs中,这不是问题,因为可选参数很容易,但显然不在.NET中。
感谢您的反馈,我已按照您的建议实施了包装。我试图避免这种解决方案,因为我不想构建太多的包装程序层。但是,如果不支持.NET中的可选参数,则看起来没有其他选择。这似乎是TSQL(其中可选参数很常见(至少在我的代码中))和.NET之间的一种不幸的“阻抗不匹配”,而在.NET中,它们甚至不可能(尚)。 – Pondlife 2009-07-03 08:32:22