Использование блоков IF и WHILE для управления ходом выполнения программы
Все языки программирования включают элементы, которые помогают определить поток программы или порядок выполнения инструкций. В то время как не столь же полнофункциональный язык, как C#, T-SQL предоставляет набор ключевых слов управления потоком, которые можно использовать для выполнения логических тестов и создания циклов, содержащих инструкции обработки данных T-SQL. На этом занятии вы узнаете, как использовать ключевые слова T-SQL IF и WHILE.
Понимание управляющих конструкций T-SQL
SQL Server предоставляет языковые элементы, которые управляют потоком выполнения программы в пакетах T-SQL, хранимых процедурах и многостатных пользовательских функциях. Эти элементы управления потока означают, что можно программно определить, следует ли выполнять инструкции и программно определять порядок этих инструкций, которые должны выполняться.
Эти элементы включают в себя, но не ограничиваются следующими элементами:
- ЕСЛИ... ELSE, который выполняет код на основе логического выражения.
- WHILE, который создает цикл, выполняется, если условие истинно.
- BEGIN... END, который определяет серию инструкций T-SQL, которые должны выполняться вместе.
- Другие ключевые слова, например BREAK, CONTINUE, WAITFOR и RETURN, которые используются для поддержки операций управления потоками T-SQL.
Ниже приведен пример инструкции IF:
IF OBJECT_ID('dbo.tl') IS NOT NULL
DROP TABLE dbo.tl
GO
Используйте условную логику в программах с помощью IF... ИНАЧЕ
Структура IF...ELSE используется в T-SQL для условного выполнения блока кода на основе условия. Оператор IF определяет, будет ли выполняться следующая операция или блок (если используется BEGIN...END). Если предикат оценивается как TRUE, выполняется код в блоке. Если предикат оценивается как FALSE или UNKNOWN, блок не выполняется, если для идентификации другого блока кода не используется необязательное ключевое слово ELSE.
В следующей инструкции IF мы спрашиваем базу данных, является ли OBJECT_ID NULL, и если да, возвращает утверждение PRINT. В этом примере объект не является NULL и, следовательно, ложный, что означает, что код в блоках BEGIN/END не будет выполнен. Оператор PRINT будет выполняться только в том случае, если объект не существует в базе данных.
USE TSQL;
GO
IF OBJECT_ID('HR.Employees') IS NULL --this object does exist in the sample database
BEGIN
PRINT 'The specified object does not exist';
END;
Из-за ограничений в приведенном выше коде только с оператором IF это может быть запутано. Объединение IF и ELSE обеспечивает большую гибкость с логикой в коде, и вы можете использовать несколько инструкций ELSE. При использовании ELSE у вас есть еще один параметр выполнения, если предикат IF оценивается как FALSE или UNKNOWN, как показано в следующем примере:
IF OBJECT_ID('HR.Employees') IS NULL --this object does exist in the sample database
BEGIN
PRINT 'The specified object does not exist';
END
ELSE
BEGIN
PRINT 'The specified object exists';
END;
В операциях обработки данных использование ключевого слова IF с ключевым словом EXISTS может быть полезным инструментом для эффективной проверки существования, как показано в следующем примере:
IF EXISTS (SELECT * FROM Sales.EmpOrders WHERE empid =5)
BEGIN
PRINT 'Employee has associated orders';
END;
Понимание циклов с использованием инструкций WHILE
Инструкция WHILE используется для выполнения кода в цикле на основе предиката. Как и оператор IF, оператор WHILE определяет, будет ли выполняться следующая инструкция или блок (если используется BEGIN...END). Цикл продолжает выполняться до тех пор, пока условие оценивается как TRUE. Как правило, вы управляете циклом с помощью переменной, проверенной предикатом и управляемой в теле самого цикла.
В следующем примере переменная @empid используется в предикате и изменяет своё значение в блоке BEGIN...END.
DECLARE @empid AS INT = 1, @lname AS NVARCHAR(20);
WHILE @empid <=5
BEGIN
SELECT @lname = lastname FROM HR.Employees
WHERE empid = @empid;
PRINT @lname;
SET @empid += 1;
END;
Для дополнительных параметров в цикле WHILE можно использовать ключевые слова CONTINUE и BREAK для управления потоком.