【问题标题】:Optional parameters in stored procedure in SQL ServerSQL Server 存储过程中的可选参数
【发布时间】:2016-05-26 16:47:03
【问题描述】:

我是 Stack Overflow 以及存储过程的新手。我想建立一个包含三个可选参数和三个依赖参数的过程。如果用户不提供那些可选参数,那么结果集将返回所有可能给定的三个依赖项。

在我看来,它看起来类似于:

@Color1,--optional   
@Color2,--optional    
@Color3,--optional    
@Date,--dependent    
@Item,--dependent    
@Price--dependent    

IF @Color1 IS NULL OR @Color2 IS NULL OR @Color3 IS NULL    
THEN 
    EXEC (SELECT * 
          WHERE 
              Date = @Date AND 
              Item = @Item AND 
              Price = @Price)
ELSE 
    EXEC (SELECT * 
          WHERE 
              Color1 = @Color1 AND
              Color2 = @Color2 AND
              Color3 = @Color3 AND
              Date = @Date AND 
              Item = @Item AND 
              Price = @Price)

但我仍在学习。在此先感谢您的帮助

【问题讨论】:

    标签: sql-server-2008 stored-procedures optional-parameters


    【解决方案1】:

    首先你应该提供参数的默认值,然后将它们与列值或空值进行比较:

    create procedure somename
    @p1 int,
    @p2 int = null,
    @p3 int = null
    as
    begin
    
        select * from sometable
        where col1 = @p1 and
              (col2 = @p2 or @p2 is null) and
              (col3 = @p3 or @p3 is null)
    
    end
    

    然后你可以像这样调用proc:

    exec somename @p1 = 1
    exec somename @p1 = 1, @p2 = 2
    exec somename @p1 = 1, @p2 = 2, @p3 = 3
    

    它会按您的预期工作。使用您的方法,您实际上需要 2^N IF 检查其中 N 是此类参数的数量。想象一下,对于 5 个参数,您需要进行 2^5 = 32 IF 检查。使用提供的方法,您将在一个查询中完成所有操作,并且只需 5 次检查。

    【讨论】:

      猜你喜欢
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多