2013-06-29 3 views
2

Мы используем цикл WHILE в SQL Server 2008 вместо Cursor. Теперь я хочу найти, какой метод лучше всего написать в моей процедуре WHILE.Перерыв ключевого слова vs Переменная в петле WHILE

Метод 1 (Использование BREAK ключевое слово):

DECLARE @V_Counter INT = 1; 

WHILE (1 = 1) 
BEGIN 
    PRINT @V_Counter; 
    SET @V_Counter = @V_Counter + 1; 

    IF @V_Counter = 4 
    BEGIN 
     BREAK; 
    END 
END 

Метод 2 (Использование BOOL ПЕРЕМЕННОЙ):

DECLARE @V_Counter INT = 1, @V_CloseLoop TINYINT = 1; 

WHILE (@V_CloseLoop = 1) 
BEGIN 
    PRINT @V_Counter; 
    SET @V_Counter = @V_Counter + 1; 

    IF @V_Counter = 4 
    BEGIN 
     SET @V_CloseLoop = 0; 
    END 
END 

Мои вопросы:

  • W какой метод я должен использовать, или оба они одинаковы?
  • Есть ли какой-либо другой метод, который я могу использовать?

Заранее спасибо ...

+1

* Мы используем цикл WHILE ... вместо курсора * - в 'WHILE 'все еще почти так же плохо, как курсор. Вы должны проверить, не можете ли вы использовать 'WHILE' и пойти с действительно установленным подходом. ** THAT ** действительно будет иметь заметную разницу в скорости –

+0

@marc_s Можете ли вы предоставить мне ссылку на этот подход или любой пример. Я хочу реализовать лучший подход вместо курсора. Я обнаружил, что цикл While лучше, чем курсор. Поэтому я пытаюсь реализовать это в своей процедуре. –

+1

Просто найдите Google (или Bing) для 'SQL Server Thinking in Sets', и у вас будет ** много ** ссылок, например. [T-SQL Foundations: Thinking in Sets] (http://sqlmag.com/t-sql/t-sql-foundations-thinking-sets) и ** много, много! ** –

ответ

0

Какой метод я должен использовать или оба такие же? Нет, оба не одинаковы.

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

DECLARE @V_Counter INT = 1; 

WHILE (1 = 1) 
BEGIN 
    PRINT @V_Counter; 
    SET @V_Counter = @V_Counter + 1; 

    IF @V_Counter = 4 
    BEGIN 
     BREAK; 
    END 
    PRINT 'STACKOVERFLOW' // this is not executed. 
END 


DECLARE @V_Counter INT = 1, @V_CloseLoop TINYINT = 1; 

WHILE (@V_CloseLoop = 1) 
BEGIN 
    PRINT @V_Counter; 
    SET @V_Counter = @V_Counter + 1; 

    IF @V_Counter = 4 
    BEGIN 
     SET @V_CloseLoop = 0; 
    END 
    PRINT 'STACKOVERFLOW' // this is executed. 
END 

Использование перерыва всегда будет чистый подход, чем установка переменной к нулю, так как код будет легко поддерживать, когда мы используем перерыв, чем наоборот.

+0

Спасибо за ответ, но я не написал код после условия IF. Я написал всю бизнес-логику до состояния IF. Итак, какой метод лучше использовать? –

+1

Ни один из них. Используйте инструкции на основе оснований, избегайте использования курсоров и в то время как петли –

+0

Извините, «перерыв» - это ** не ** чистый подход. Обычно это считается плохим стилем программирования. Используйте его только в том случае, если у вас есть веская причина. –

0

A break считается «плохой стиль программирования». Так лучше использовать переменную. Если у вас есть веская причина.

Но старайтесь избегать while петель на всех. В SQL Server вы можете очень часто заменять циклы хорошими операторами SQL, которые делают все в одном спешке.

+0

Благодарим за ответ, но я не написал код после условия IF. Я написал всю бизнес-логику до состояния IF, которое включает более 50 запросов в соответствии с моей бизнес-логикой. Итак, как я могу исключить использование цикла WHILE? –

+0

@SaharshShah Я могу ответить на это только тогда, когда увижу всю вашу бизнес-логику. В SQL Server у вас обычно есть другой подход, как в Java или C#. Программирование в SQL не должно выполняться в циклах, это делается с помощью инструкций, которые обрабатывают множество вещей только в ** ** **. Тогда вы также получите лучшую производительность. Петли часто очень медленные и слабые. BTW, я не понимаю ваш конкретный цикл здесь вообще - вы просто считаете счетчик до 4 ... –

+0

Это пример кода. Я запускаю цикл динамически. –

0

a) Что вы здесь вообще делаете? Я вижу, счетчик подсчитываются до 4 ...;)

б) можно переписать так:

DECLARE @V_Counter INT = 1; 

WHILE (@V_Counter < 4) 
BEGIN 
    PRINT @V_Counter; 
    SET @V_Counter = @V_Counter + 1; 
END