【问题标题】:Passing Multiple Between Statements To Stored Procedure将多个语句之间传递给存储过程
【发布时间】:2017-07-16 18:38:15
【问题描述】:

我有一个充满产品的表,之前我们将MaxPriceMinPrice 传递给存储过程,并选择了价格在两个值之间的产品。

但现在我想传递多个范围值,并希望选择价格在多个范围之间的产品。

假设我有一个这样的存储过程:

@PriceMin decimal(18, 4) = null,
@PriceMax decimal(18, 4) = null,

... 
WHERE 
    product.Price > @PriceMin 
    AND product.Price < @PriceMax

但现在我想根据用户选择传递多个值范围,并进行如下选择:

WHERE 
    (product.Price > @PriceMin1 AND product.Price < @PriceMax1)
    OR (product.Price > @PriceMin2 AND product.Price < @PriceMax2)
    OR (product.Price > @PriceMin3 AND product.Price < @PriceMax3)
...

我该怎么做?

【问题讨论】:

  • 使用动态查询构造WHERE子句

标签: sql sql-server stored-procedures


【解决方案1】:

我将假设您不知道要预先传递多少范围,所以我将使用表值参数将数据传递给存储过程。

第 1 步: 创建 TVP

CREATE TYPE dbo.Ranges AS TABLE  
    ( PriceMin  decimal(18, 4), PriceMax   decimal(18, 4) )  

第二步:修改你的存储过程参数列表和代码

ALTER PROCEDURE usp_selectBasedOnPrice   
    (@rangeList dbo.Ranges READONLY)  
BEGIN
..
-- from product
-- WHERE product.Price > @PriceMin and product.Price < @PriceMax

from product p JOIN @rangeList r
 on p.Price  BETWEEN r.PriceMin  AND r.PriceMax 
END

PS:请注意,BETWEEN 优于 &gt;&lt; 声明,在这种情况下,如果您的价格范围包含在内,即如果您确实需要 =;并且JOIN 比多个WHERE 子句要好得多

请注意,BETWEEN 相当于 = 而不是

的简写

MS documentation on TVP

【讨论】:

  • 为什么BETWEEN&gt;&lt; 更好(除了两者不等价的事实)?
  • 我同意它们不一样,事实上,由于BETWEEN 的错误使用(尤其是日期时间参数),我已经多次陷入困境。我想告诉 OP 使用 between 而不是 因为(我猜想)这个问题实际上应该使用 BETWEEN (即包含范围),而 BETWEEN 只是甜美而清晰的语法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 2015-08-20
  • 2011-07-12
  • 1970-01-01
相关资源
最近更新 更多