我有一个存储过程,需要执行4个参数。但我想通过只传递3个参数来执行它。我怎样才能做到这一点?
例如:我的存储过程通常像这样执行。
EXEC usp_my_sp @fname = 'Sandeep',
@lname = 'Kumar',
@age = '26',
@city = 'New Delhi'**
它将返回名为Sandeep Kumar
,年龄= 26且居住在New Delhi
的所有人。
但我想让所有城市的所有名为Sandeep Kumar
的26岁的人都来。这里我需要省略第4个参数。
我怎样才能做到这一点?
谢谢, 和Sandeep
答案 0 :(得分:3)
创建具有空默认值的参数,并使用coalesce()
,(或IsNUll()
)编写Where子句谓词。
Create procedure MySP
@fName varchar(50) = null,
@lName varchar(50) = null,
@age byte = null,
@city varchar(30) = null
as
Select -- stuff
From MyTable
Where firstName = coalesce(@fName, firstName )
and lastName = coalesce(@lName, LastName)
and City = coalesce(@city , City )
and lastName = coalesce(@lName, LastName)
答案 1 :(得分:1)
您正在描述具有动态搜索条件的全能查询。
基本的非优化解决方案是将where
的{{1}}条款更改为此类(@city
作为您的表的别名):
t
有些人也把它写成
where (t.city = @city or @city is null)
这两个选项都将返回正确的结果集,但对于某个过程,这可能会导致缓存计划的问题对于给定的参数集是次优的。有一些解决方案可以改善这种情况,最简单的方法是在查询结束时添加where t.city = isnull(@city,t.city)
。这将为每次调用过程生成一个新的查询计划,因此每次执行都会产生一些额外的开销。
更复杂的解决方案是使用动态sql重写查询,为此,我将引导您使用以下资源:
catch-all查询参考: