1

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

4

3 回答 3

1

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

于 2009-04-05T11:53:15.820 回答
1

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

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

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

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

于 2012-10-10T00:34:45.490 回答
-1

您可以将其作为 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 的所有人员。

于 2009-04-05T13:54:26.653 回答