Главная » Microsoft SQL Server, Базы данных » Управление выполнением процедур

0

На первый взгляд кажется, что язык Т-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 <3;

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 Brain.Thoughts

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 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии