默认参数值/在SQL Server 2005的.NET存储过程的可选参数(Default param

2019-07-29 11:18发布

SQL Server的C#编写的,因为它有SqlInt32参数的.NET 2.0框架的存储过程。 我试图使参数可选。 下面是只是打印传递给它的整数最小的测试案例:

[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 PROC。 这要求所有的程序,以支持相同的参数,还有几个是可选的。 调用代码已经在生产,所以我想,以避免改变它的每一个参数传递每个调用。 在TSQL特效,这不是一个问题,因为可选参数是容易的,但显然不是在.NET。

Answer 1:

正如您所指出的,这是因为C#2.0不支持可选参数。

一个解决办法可能是包裹在做接受默认paramters常规T-SQL存储过程的.NET存储过程。

例如:

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

这是一个有点难看,但可能让你在路上现在。



文章来源: Default parameter values/optional parameters for .NET stored procedures in SQL Server 2005