我有一张充满产品的表,之前我们将MaxPrice和传递MinPrice给存储过程,并选择了价格介于两个值之间的产品。
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) ...
我怎样才能做到这一点?
我将假设您不知道要预先传递多少范围,因此我将使用表值参数将数据传递给存储过程。
步骤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
>
<
JOIN
WHERE
请注意,BETWEEN等同于<=,> =而不是<,>的简写
[MS documentation on TVP](https://docs.microsoft.com/en- us/dotnet/framework/data/adonet/sql/table-valued-parameters)