Как использовать коммутатор в SQL Server

Я хочу использовать CASE в своей хранимой процедуре. Я получаю некоторую синтаксическую ошибку в моем коде:

select 
   case @Temp
   when 1 then (@selectoneCount=@selectoneCount+1)
   when 2 then (@selectoneCount=@selectoneCount+1)
   end

При запуске я получаю:

неверный синтаксис рядом с '='.

в этой строке здесь:

@selectoneCount = @selectoneCount + 1

около равных.

На самом деле я получаю возвращаемое значение из другого sp в @temp, а затем, если @temp = 1, я хочу увеличить счетчик @SelectoneCount на 1 и так далее. Пожалуйста, дайте мне знать, каков правильный синтаксис.


person Ram Singh    schedule 27.06.2012    source источник
comment
CASE — это выражение, возвращающее значение. Я понятия не имею, что вы пытаетесь здесь сделать - может быть, расскажите нам об общей цели, а затем поместите приведенный выше код в более крупный пример, чтобы установить контекст?   -  person Damien_The_Unbeliever    schedule 27.06.2012
comment
Этот ответ полезен, если вы действительно хотите выполнить логический поток, а не выбирать выражение stackoverflow.com/a/14760234/74585   -  person Matthew Lock    schedule 22.10.2014


Ответы (4)


CASE — это просто «переключатель» для возврата значения, а не для выполнения всего блока кода.

Вам нужно изменить свой код на что-то вроде этого:

SELECT 
   @selectoneCount = CASE @Temp
                         WHEN 1 THEN @selectoneCount + 1
                         WHEN 2 THEN @selectoneCount + 1
                     END

Если @temp не установлено ни одно из этих значений (1 или 2), вы получите обратно NULL

person marc_s    schedule 27.06.2012
comment
Tanx для вашего ответа, я думал, что «кейс» в sqlserver может действовать так же, как переключатель-кейс в С# $ ( - person reza akhlaghi; 06.04.2015
comment
используйте ELSE @selectoneCount если вы хотите создать случай по умолчанию, когда @Temp не равен 1 или 2, а @selectoneCount не изменяется. - person woodvi; 16.06.2017
comment
тогда как добавить условие по умолчанию? - person J M; 17.01.2019
comment
вы можете написать условие по умолчанию в else. Если все случаи терпят неудачу, он переходит к другому условию. @Дж М - person Chirag Kanzariya; 19.02.2020

Это оператор select, поэтому каждая ветвь case должна что-то возвращать. Если вы хотите выполнить действия, просто используйте if.

person cjk    schedule 27.06.2012

На самом деле я получаю возвращаемое значение из другого sp в @temp, а затем @temp = 1, затем я хочу увеличить количество @SelectoneCount на 1 и так далее. Пожалуйста, дайте мне знать, каков правильный синтаксис.

Что случилось с:

IF @Temp = 1 --Or @Temp = 2 also?
BEGIN
    SET @SelectoneCount = @SelectoneCount + 1
END

(Хотя это действительно пахнет процедурным кодом - обычно это не лучший способ использования SQL)

person Damien_The_Unbeliever    schedule 27.06.2012
comment
в этом нет ничего плохого, но у меня есть 15-20 условий, поэтому я хотел использовать переключатель там - person Ram Singh; 27.06.2012
comment
@RamSingh - в языке SQL нет переключателя оператор. Как указывали другие, вы можете использовать CASE выражение, но оно должно вычислять и возвращать скалярное значение. - person Damien_The_Unbeliever; 27.06.2012
comment
хорошо, спасибо, это означает, что я должен использовать if else для моей ситуации. - person Ram Singh; 27.06.2012

person    schedule
comment
объявить Temp int объявить selectoneCount int set Temp = 2 set selectoneCount = 0 select selectoneCount = case @Temp when 1 then (selectoneCount+1) when 2 then (selectoneCount+5) end select selectoneCount - person fernando yevenes; 08.02.2019