Использование блоков IF и WHILE для управления ходом выполнения программы

Завершено

Все языки программирования включают элементы, которые помогают определить поток программы или порядок выполнения инструкций. В то время как не столь же полнофункциональный язык, как C#, T-SQL предоставляет набор ключевых слов управления потоком, которые можно использовать для выполнения логических тестов и создания циклов, содержащих инструкции обработки данных T-SQL. На этом занятии вы узнаете, как использовать ключевые слова T-SQL и WHILE T-SQLIF.

Понимание управляющих конструкций T-SQL

SQL Server предоставляет языковые элементы, которые управляют потоком выполнения программы в пакетах T-SQL, хранимых процедурах и многостатных пользовательских функциях. Эти элементы управления потока означают, что можно программно определить, следует ли выполнять инструкции и программно определять порядок этих инструкций, которые должны выполняться.

Эти элементы включают в себя, но не ограничиваются следующими элементами:

  • IF...ELSE, который выполняет код на основе логического выражения.
  • WHILE, который создает цикл, выполняющий условие, имеет значение true.
  • BEGIN...END, который определяет ряд инструкций T-SQL, которые должны выполняться вместе.
  • Другие ключевые слова, например, BREAKCONTINUEWAITFOR и 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 IS NULL, и если да, верните инструкцию PRINT . В этом примере объект не имеет значения NULL и, следовательно, FALSE, что означает, что 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 . SELECT используется здесь (а не SET) для демонстрации значения столбца из результата запроса в переменную:

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 ключевые слова для управления потоком.