使用 IF 和 WHILE 块来控制程序流
所有编程语言都包含有助于确定程序流的元素,或执行语句的顺序。 T-SQL 虽然不像 C# 等语言那样功能完备,但提供了一组可用于执行逻辑测试并创建包含 T-SQL 数据作语句的循环的流控制关键字。 在本课中,你将了解如何使用 T-SQL IF 和 WHILE 关键字。
了解流语言的 T-SQL 控制
SQL Server 提供语言元素,用于控制 T-SQL 批处理、存储过程和多语句用户定义函数中的程序执行流。 这些流控制元素意味着可以编程方式确定是否执行语句,并以编程方式确定应执行的这些语句的顺序。
这些元素包括但不限于:
- "IF...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
在程序中使用“如果...否则”条件语句
T-SQL 中的 IF...ELSE 结构用于根据谓词有条件地执行代码块。 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 关键字来控制流。