【发布时间】:2012-10-10 08:34:45
【问题描述】:
我在 MSSQL 2005 Server SQLCLR 中有一个存储过程。 是否可以为它定义一个可选参数? 如果有,怎么做?
【问题讨论】:
标签: sql-server sqlclr
我在 MSSQL 2005 Server SQLCLR 中有一个存储过程。 是否可以为它定义一个可选参数? 如果有,怎么做?
【问题讨论】:
标签: sql-server sqlclr
想到的最快(如果不是最简洁)的解决方案是使用带有默认值的可选参数的“shim”存储过程,它使用这些默认值调用内部存储过程,就像您为“可选”使用方法重载一样' C# 3 及更早版本中的参数。
【讨论】:
只为你想要默认的值传入 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
【讨论】:
你可以将它作为 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 的人。
【讨论】: