【问题标题】:Use optional arguments in SQLCLR在 SQLCLR 中使用可选参数
【发布时间】:2012-10-10 08:34:45
【问题描述】:

我在 MSSQL 2005 Server SQLCLR 中有一个存储过程。 是否可以为它定义一个可选参数? 如果有,怎么做?

【问题讨论】:

    标签: sql-server sqlclr


    【解决方案1】:

    想到的最快(如果不是最简洁)的解决方案是使用带有默认值的可选参数的“shim”存储过程,它使用这些默认值调用内部存储过程,就像您为“可选”使用方法重载一样' C# 3 及更早版本中的参数。

    【讨论】:

    • 是的,这就是我现在正在做的事情,但我试图避免为同一件事使用多个存储过程。
    【解决方案2】:

    只为你想要默认的值传入 Null 有什么问题吗?
    当然,这可能不适用于所有情况。
    有时您可能想知道实际值是否确实为 Null,因此请避免使用默认值。
    如果是这种情况,那么我会求助于添加一个额外的“Default”参数。

    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void MySproc(SqlInt32 pID, SqlBoolean UseDefault_pID)
    {
        pID = (UseDefault_pID == SqlBoolean.True && pID == SqlInt32.Null)
            ? SomeDefaultPIDValue : pID;
    }
    

    这样就不必编写额外的“wrapper”存储过程来接收具有默认值的可选参数,然后调用您的 CLR 存储过程。

    在 Null 传入时使用默认值:UseDefault_pID = 1
    传入 Null 时保留实际值:UseDefault_pID = 0

    【讨论】:

    • 我猜没有错。看到这是3.5年前的事情,我不记得最初的情况了。我只能猜测它是一个带有几个可选参数的过程,所以默认的检查代码可能会很长。
    【解决方案3】:

    你可以将它作为 null 传递,然后执行如下操作:

    create proc sp_find_person
     @fname varchar(30)
     @lname varchar(60)
    as
    begin
     select * from person a
     where (a.fname = @fname or @fname is null) 
       and (a.lname = @lname or @lname is null);
    end
    go
    

    将两个参数都传递为 null 将返回 person 的所有行。

    传递带有值的@fname 和@lname null 将返回所有具有该@fname 的人。

    传递带有值的@lname 和@fname null 将返回所有具有该@lname 的人。

    同时传递一个非空值将找到所有具有指定 fname 和 lname 的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多