使用较少的输入参数执行存储过程

时间:2017-05-13 12:54:37

标签: sql-server stored-procedures

我有一个存储过程,需要执行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

2 个答案:

答案 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查询参考: