将多个语句之间传递给存储过程

时间:2017-07-15 08:48:36

标签: sql sql-server stored-procedures

我有一个充满产品的表格,之前我们将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)
...

我该怎么做?

1 个答案:

答案 0 :(得分:3)

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

第1步:制作TVP

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

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

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优于><声明,在这种情况下,如果您的价格范围是包含性的,即如果您确实需要&lt; =和&gt; =;并且JOIN比多个WHERE条款

好得多

请注意,BETWEEN相当于&lt; =,&gt; =的简写,而不是&lt;,&gt;

MS documentation on TVP