Управління виконанням процедур

На перший погляд здається, що мова Т-SQL практично повністю позбавлений засобів управління потоком команд Однак незважаючи на відносну бідність цих коштів, їх цілком достатньо Булеві розширення управління даними exists, in і case з успіхом компенсують обмеженість операторів if і while

Оператор if

Так, це ще той оператор if, який використовував ваш дідусь У той же час цей оператор в мові Т-SQL ще сильніше обмежений-всього однією інструкцією Один оператор if – одна команда До того ж його НЕ обмежують ні then, ні end if Загальний синтаксис цього оператора наступний:

IF умова

інструкція

У наведеному нижче прикладі умова if не виконується, що запобігає виконання наступного за ним оператора

IF 1 = О

PRINT 1 Перший рядок ;

PRINT Другий рядок;

Результат буде наступним:

Другий рядок

За оператором if не слід крапка з комою-якщо вона буде бути присутні Назаметку вать, то це розглядатиметься як помилка Насправді оператор if є всього лише префіксом до наступного, і вони обидва розглядаються як одна інструкція

Begin..End

Команду If, що дозволяє виконати всього одну інструкцію, не можна назвати особливо корисною Однак можна створити блок інструкцій, обмеживши його командами begin і end, як у наступному прикладі:

IF умова Begin

кілька інструкцій

End

Пригадується, як одного разу я протягом декількох годин безуспішно намагався знайти помилку в збереженій процедурі Вона виникала в будь-якій випадку, що б я не намагався робити Зрештою виявилося, що я забув вказати ключові слова begin і end, і помилка генерировалась незалежно від виконання умови Таку помилку дуже просто допустити, але дуже складно локалізувати

If Exists()

Незважаючи на те що оператор if виглядає обмеженим, його пропозиція умови може включати в себе потужні функції, подібно пропозицією WHERE Це вираження if exists () і if .. in ()

Вираз if exists Про використовує в якості умови наявність небудь рядка, повернутої інструкцією SELECT Так як шукаються будь-які рядки, список стовпців в інструкції SELECT можна замінити зірочкою Цей метод працює швидше, ніж перевірка умови @ @ rowcount> 0, тому що не потрібно підрахунок загальної кількості рядків Як тільки хоча б один рядок задовольняє умові if exists О, запит може продовжувати виконання

У наступному прикладі вираз if exists () використовується для перевірки замовлень, якщо хоча б один з них відкритий:

USE OBXKITES

IF EXISTS(SELECT * FROM [ORDER] WHERE Closed = 0)

BEGIN

Print Обробка замовлень1

END

Насправді для даного виразу не існує відмінностей між відбором всіх стовпців або тільки обраних Однак на практиці відбір всіх стовпців дозволяє функції вибрати найкращий з них (можливо, проіндексований) і виконатися трохи швидше

If..Else

Необовязкова команда else дозволяє задати інструкцію, яка буде виконана в разі, якщо умова if не буде виконано Подібно if, оператор else управляє тільки безпосередньо наступної за ним командою або блоком begin end:

IF умова

один рядок або блок begin End

ELSE

один рядок або блок begin .. end

While

Команда while використовується для циклічного виконання інструкцій, поки деякий умова є істинним Подібно команді if, її дія поширюється тільки на безпосередньо наступну за нею інструкцію або на блок begin end

Деякі методи створення циклів відрізняються часом виконання перевірки умови Оператор while мови Т-SQL працює таким чином

1 Команда while перевіряє виконання умови Якщо воно виявляється істинним, виконується наступна інструкція або їх блок в іншому випадку вони не виконуються

2 Після завершення виконання інструкції або їх блоку управління знову передається оператору while

Наступний короткий сценарій демонструє використання оператора while для створення циклу:

Declare @Temp Int

Set @Temp = 0

While @Temp &lt3

Begin

Print тестоване умова + Str (@ Temp)

Set @Temp = @Temp + 1

End

Буде отримано наступний результат:

тестоване умова 0

тестоване умова 1

тестоване умова 2

Команди continue і break розширюють можливості створення циклів Перша з них дозволяє негайно повернутися до команди while Далі умова перевіряється в звичайному порядку

Команда break дозволяє негайно вийти з циклу і продовжити виконання сценарію так, ніби умова while не було виконано У наступному прикладі (не призначеному для фактичного запуску) продемонстровано використання команди break:

CREATE PROCEDURE MyLifeO AS

WHILE Not @@Eyes2blurry = 1 BEGIN

EXEC Eat

INSERT INTO Book(Words)

FROM Brain(Words)

WHERE BrainThoughts

IN(Make sense, Good Code, BestPractice)

IF @StarTrekNextGen = On

BREAK

END

Goto

Перш ніж асоціювати команду Goto з програмами на мові BASIC кінця 1970-х років, що нагадують спагетті, слід сказати, що в даному випадку команда goto призначена для переходу до мітці тільки в межах одного пакета або процедури і рідко використовується для чогось іншого, окрім як обробки помилок

Сама мітка має вигляд ідентифікатора з поміщеним в кінці символом двокрапки: Імя_меткі:

У наступному прикладі команда goto використовується для переходу до мітці errorhandler:, в обхід команди print:

GOTO ErrorHandler

Print more code;

ErrorHandler:

Print Logging the error;

Результат виконання процедури:

Logging the error

Джерело: Нільсен, Пол Microsoft SQL Server 2005 Біблія користувача : Пер з англ – М: ООО ІД Вільямс , 2008 – 1232 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*