代码之家  ›  专栏  ›  技术社区  ›  Pondlife

SQL Server 2005中.NET存储过程的默认参数值/可选参数

  •  3
  • Pondlife  · 技术社区  · 16 年前

    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中。

    1 回复  |  直到 15 年前
        1
  •  1
  •   erlando    16 年前

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

    解决方法之一可能是将.NET存储过程包装在接受默认参数的常规T-SQL存储过程中。

    例如:

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

    它有点难看,但现在可能会让你上路。