2017-07-15 1 views
2

J'ai une table pleine de produits, précédemment nous avons passé un MaxPrice et MinPrice à la procédure stockée et produits sélectionnés avec le prix entre deux valeurs. Mais maintenant je veux passer plusieurs valeurs de gamme et je veux sélectionner des produits dont les prix sont entre plusieurs gammes.Passage multiple entre les instructions à la procédure stockée

Disons que j'avais une procédure stockée comme ceci:

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

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

mais maintenant je veux passer plusieurs plage de valeurs basées sur la sélection d'utilisateur et une sélection comme ceci:

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

Comment puis-je faire ceci?

+0

utilisation requête dynamique pour construire WHERE clause – SQL006

Répondre

3

Je vais supposer que vous ne savez pas combien de plages vont être passées à l'avant, donc je prendrais le paramètre de valeur de table pour passer des données à la procédure stockée.

Étape 1: Créer un PVT

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

Étape 2: Modifier votre liste de paramètres de procédure stockée et le code

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: Notez que BETWEEN est mieux que > et < déclaration, dans ce cas si vos fourchettes de prix sont inclus, c'est-à-dire si vous avez réellement besoin de < = et> =; et JOIN est beaucoup mieux que plusieurs WHERE clauses

S'il vous plaît faire noter qu'entre est équivalente à la main courte pour < =,> = et non <,>

MS documentation on TVP

+2

Pourquoi 'BETWEEN' est-il meilleur que'> 'et' <'(autre que le fait que les deux ne sont pas équivalents)? –

+0

Je suis d'accord, ils ne sont pas les mêmes, en fait, plusieurs fois j'ai été dans une soupe en raison d'une mauvaise utilisation de 'BETWEEN' (en particulier avec des arguments datetime). Je voulais dire OP à utiliser entre plutôt que <, > parce que (j'ai deviné que) ce problème devrait utiliser BETWEEN (c'est-à-dire inclus sur les gammes) et BETWEEN est juste une syntaxe douce et claire. – DhruvJoshi

+0

Je pense que '> =' et '<=' est une syntaxe plus claire. –