настройка хранимой процедуры

У меня есть хранимая процедура, которая вызывается с параметром. Я хотел бы проверить, что такое PARAM @Value, и в зависимости от значения я хочу добавить часть предложения WHERE, если оно равно определенному значению.

Допустим, процедура выглядит так:

  Select Sum(Cost) as Cost, Car, Make
  INTO #TempTable1
  WHERE 
  1=1 and Date > '04/21/2020'

  IF @Value in (1,2,3)
  AND Color= 'Black'

  GROUP BY
  Car, Make

Это очень упрощенный код, мое предложение WHERE для @Value=1,2,3 будет намного больше.

По сути, моя цель — добавить часть предложения WHERE, если @Value = 1, 2, 3. Что-то вроде выполнимого?

РЕДАКТИРОВАТЬ: Что, если над моим оператором выбора я добавлю что-то вроде

 DECLARE @WHERE AS VARCHAR(MAX)
 IF @VALUE IN (1,2,3) 
   SET @WHERE = 'color = ''black'''

person Koosh    schedule 21.04.2020    source источник


Ответы (1)


Вы можете добавить условие:

AND ((@VALUE IN (1,2,3) AND Color='Black') OR VALUE NOT IN (1,2,3))

Или вы можете написать динамический SQL.

DECLARE @Statement NVARCHAR(1000);
SET @Statement = 'Select Sum(Cost) as Cost, Car, Make INTO #TempTable1 WHERE   Date > ''04/21/2020'''
IF(@value in (1,2,3))
  BEGIN
    SET @Statement=@Statement+' and Color=''Black'''
  END
SET @Statement=@Statement+ ' GROUP BY Car,Make ' 
EXEC sp_executesql   @Statement

Альтернатива:

Select Sum(Cost) as Cost, Car, Make
INTO #TempTable1
WHERE 
  1=1 and Date > '04/21/2020'
AND  
    CASE WHEN @flag N (1,2,3) 
    THEN color
    ELSE 'Black'
    END = 'Black'
GROUP BY
  Car, Make

Последний вариант:

IF @value in (1,2,3) 
BEGIN
    Select Sum(Cost) as Cost, Car, Make
    INTO #TempTable1
    WHERE 1=1 and Date > '04/21/2020'
    AND color='Black'
    GROUP BY Car, Make
END
ELSE
BEGIN
    Select Sum(Cost) as Cost, Car, Make
    INTO #TempTable1
    WHERE 1=1 and Date > '04/21/2020'
    GROUP BY Car, Make
END
person Gabriel Durac    schedule 21.04.2020
comment
Есть ли способ создать переменную и установить для нее значение color=black, если @Value = 1,2,3, а затем использовать эту переменную в моем предложении без динамического SQL. Добавьте только дополнительное предложение where как DYNAMIC, что-то вроде EDIT в моем вопросе. - person Koosh; 21.04.2020
comment
если вы хотите пойти по этому пути, вам нужно использовать динамический SQL. Я обновлю свой ответ еще парой альтернатив - person Gabriel Durac; 21.04.2020
comment
в основном оператор SELECT очень большой, и я бы не хотел делать его динамическим SQL. Я бы хотел сделать это только с предложением where. Спасибо - person Koosh; 21.04.2020
comment
@Koosh Создание переменной и использование ее в вашем предложении при описании динамического SQL IS. - person avery_larry; 21.04.2020