2010-05-26 2 views
4

Это то, что я делаю:Могу ли я иметь оператор CASE в цикле WHILE?

while (@counter < 3 and @newBalance >0) 
begin 
CASE 
when @counter = 1 then (@monFee1 = @monthlyFee, @newBalance = @[email protected]) 
when @counter = 2 then (@monFee2 = @monthlyFee, @newBalance = @[email protected]) 
END 
@counter = @counter +1 
end 

Я получаю эту ошибку:

Incorrect syntax near the keyword 'CASE'.

не знаю, почему. Пожалуйста помоги!

ответ

6

Нет, структура CASE в SQL должна возвращать значение, а не для потока программы. Вам нужно разбить его на утверждения IF.

7

За то, что вы предлагаете, вы должны использовать IF заявления

While (@counter < 3 and @newBalance >0) 
Begin 
    If @Counter = 1 Then 
     Begin 
      Set @monFee1 = @monthlyFee 
      Set @newBalance = @[email protected] 
     End 

    If @Counter = 2 Then 
     Begin 
      Set @monFee2 = @monthlyFee 
      Set @newBalance = @[email protected] 
     End 

    Set @counter = @counter +1 
End 
+1

+1: На примере кода, хотя и более подробно будет хорошо объяснить, что дело в SQL Server является выражением, а не решение логики в Примечания раздел в документации: http://msdn.microsoft.com/en-us/library/ms181765.aspx –

3

КОРПУС оператор не используется для разветвления логики так же, как и его двоюродный брат в процедурном коде. Он вернет результат в результирующий набор, чтобы при присвоении значения переменной вы можете определить, какое значение будет не той переменной, которую вы назначаете.

К сожалению,

(@monFee1 = @counter, @newBalance = @[email protected]) 

не возвращает значение.

Альтернативный подход с использованием If/Else bracnching логика будет

while (@counter < 3 and @newBalance >0) 
begin 
    IF @counter = 1 
    THEN 
     SET @monFee1 = @monthlyFee 
     SET @newBalance = @[email protected] 
    END 
    ELSE IF @counter = 2 
    BEGIN 
     SET @monFee2 = @monthlyFee 
     SET @newBalance = @[email protected] 
    END 
     SET @counter = @counter +1 
end 
+0

Вау. вы, ребята, быстры! – Laramie

0

Вы не должны использовать время цикла здесь. Вы эффективно проверяете значение @newBalance один раз. Рассмотрите:

@monFee1 = @monthlyFee 
@newBalance = @[email protected] 

IF @newBalance > 0 
BEGIN 
    @monFee2 = @monthlyFee 
    @newBalance = @[email protected] 
END 
+0

Искренний нерв в течение двух месяцев, что происходит, когда он уходит до 12 месяцев? –

+0

Затем он записывает рекурсивную функцию. –

0

Поскольку CASE является выражением, вы можете использовать его в инструкции присваивания SET.

WHILE (@counter < 3 and @newBalance >0) 
BEGIN 
    SET @monFee1 = CASE WHEN @Counter=1 
    THEN @monthlyFee ELSE @monFee1 END 
    SET @monFee2 = CASE WHEN @Counter=2 
    THEN @monthlyFee ELSE @monFee2 END 
    SET @newBalance = @newBalance - CASE WHEN @Counter in (1, 2) 
    THEN @fee ELSE 0 END 
    SET @counter = @counter +1 
END 

Он также может быть включен в инструкцию присваивания SELECT.

WHILE (@counter < 3 and @newBalance >0) 
BEGIN 
    SELECT 
    @monFee1 = CASE WHEN @Counter=1 
     THEN @monthlyFee ELSE @monFee1 END, 
    @monFee2 = CASE WHEN @Counter=2 
     THEN @monthlyFee ELSE @monFee2 END, 
    @newBalance = @newBalance - CASE WHEN @Counter in (1, 2) 
     THEN @fee ELSE 0 END, 
    @counter = @counter +1 
END 

PS: удачи в стареющем докладе ...

Смежные вопросы