代码之家  ›  专栏  ›  技术社区  ›  Yada

使用参数进行SQL Server 2000存储过程分支

  •  2
  • Yada  · 技术社区  · 15 年前

    我想创建一个存储过程。如果参数为-1,那么该列上不应该有WHERE子句,否则应该有WHERE子句。在没有很多if分支的情况下,最好的方法是什么?

    我查了档案。有几个相似的问题,但并不完全相同。

    CREATE PROCEDURE report
    (
      @site int,
      @promo int,
      @type int
    )
    AS
    SET NOCOUNT ON
    
    -- I want to avoid this:
    IF @site = -1 AND @promo = -1 and @type = -1
    BEGIN
      SELECT * from table
    END
    IF @site > -1 AND @promo = -1 and @type = -1
    BEGIN
      SELECT * from table WHERE site = @site;
    END
    ... -- other cases
    
    
    ELSE  -- all parameters are > -1
    BEGIN
      SELECT * from table 
      WHERE site = @site AND promo = @promo AND type = @type
    END
    
    3 回复  |  直到 15 年前
        1
  •  3
  •   gbn    15 年前

    这在很多情况下都有效,(尽管评论会说什么,但不要尝试),因为乐观主义者会忽略IsNull位。仅适用于非空列

    SELECT @site = NULLIF(@site, -1) ...
    
    SELECT * from table  
      WHERE site = ISNULL(@site, site) ..
    

    否则,有条件的,通常是不好的,因为或不能优化

    SELECT * from table  
      WHERE (@site = -1 OR site = @site) AND  (...
    

    或单独的存储过程(也不认为需要)

    或者使用sp_executesql(避免使用动态SQL)

        2
  •  1
  •   meklarian    15 年前

    怎么样:

    SELECT * FROM table WHERE
      ((site = @site) OR (@site = -1)) AND
      ((promo = @promo) OR (@promo = -1)) AND
      ((type = @type) OR (@type = -1))
    

    不过,有一点需要注意,您可能会发现SQL在优化此类查询方面不是非常智能。

        3
  •  1
  •   Steven A. Lowe    15 年前

    为什么要反对显而易见的、最简单的解决方案?

    认真地说,分支解决方案使意图明确,并且很容易被其他人理解。