小编典典

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

sql

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

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

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

@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)
...

我怎样才能做到这一点?


阅读 173

收藏
2021-04-14

共1个答案

小编典典

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

步骤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><声明要好,在这种情况下,如果您的价格范围是包容性的,即您实际上需要<=和>
=;而且JOIN比多重WHERE子句好多了

请注意,BETWEEN等同于<=,> =而不是<,>的简写

[MS documentation on TVP](https://docs.microsoft.com/en- us/dotnet/framework/data/adonet/sql/table-valued-parameters)

2021-04-14