2016-10-20 1 views
2

В моей процедуре переменная @year должна иметь две формы: 1: Если @ Год = 1, выберите все годы. 2: @ Год = введенный год.Сохраненная процедура с переменным состоянием и сообщением об ошибке

Вот пример моего кода:

CREATE PROC spProcName (@Year) 
AS 
BEGIN 
SELECT Year AS [YEAR], Item AS [ITEM] 
FROM Sales 
WHERE Year = @YEAR 

я могу заставить его работать на @Year = 2013, но я не знаю, как включить @Year = 1, чтобы выбрать все годы. Я предполагаю, что это будет с CASE.

У меня также есть много других подобных условий с другими переменными, поэтому я не могу просто создать оператор IF.

ответ

6
Where Year = Case when @Year = 1 Then Year else @Year end 
+0

Спасибо! Это сработало. – user107242

+0

@ user107242 Счастливые помочь. –

6

Альтернатива ответ Джона, но квазиэквивалентны:

WHERE (@year=1 OR [email protected]) 

В этом случае лучше всего добавить OPTION(RECOMPILE) в конце запроса, в противном случае запрос не будет в состоянии выбрать индекс, если он существует в столбце year.

0
--If you give value 1 it will select all the records from table year wise else if you give year like 2016 it fetches all the record based on given year 
ALTER PROC spProcName (@Year int) 
AS 
BEGIN 
    IF @Year = 1 
    BEGIN 
    SELECT 
     [Year] AS [YEAR], 
     Item AS [ITEM] 
    FROM Sales 
     ORDER BY [Year] 
    END 
    ELSE 
    SELECT 
     [Year] AS [YEAR], 
     Item AS [ITEM] 
    FROM Sales 
     WHERE DATEPART(YEAR, CAST([Year] AS date)) = @year 
END