настройка хранимых процедур - PullRequest
0 голосов
/ 21 апреля 2020

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

Скажем, pro c выглядит как это:

  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. Что-то вроде выполнимо?

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

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

1 Ответ

2 голосов
/ 21 апреля 2020

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

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

Или вы можете написать динамику c 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
...