在SQLCLR中使用可选参数

时间:2009-04-05 11:48:50

标签: sql-server sqlclr

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

3 个答案:

答案 0 :(得分:1)

最快,即使不是最整洁的解决方案是使用一个'shim'存储过程,其默认值为可选参数,使用这些默认值调用内部存储过程,就像使用方法重载'可选'C#3及更早版本中的参数。

答案 1 :(得分:1)

对于你想要默认的值传递Nulls有什么问题吗? 当然,这可能不适用于所有情况 有时您可能想知道实际值是否确实为空,因此避免使用默认值 如果是这种情况,那么我会采用额外的“默认”参数。

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

这节省了必须编写额外的“ wrapper ”sprocs来接受带有默认值的可选参数,然后调用你的CLR sproc。

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

答案 2 :(得分:-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的所有人员。

使用非null值传递两者将查找具有指定fname和lname的所有人。