T-SQL

T-SQL 知识量:16 - 67 - 243

2.5 流程控制语句><

BEGIN…END语句- 2.5.1 -

在T-SQL中,BEGIN...END语句用于定义一个代码块,用于将一组相关的语句组合在一起作为一个逻辑单元来执行。BEGIN...END语句块可以包含一条或多条语句,并且可以嵌套在其他BEGIN...END块中。

BEGIN...END语句块的主要作用是控制流程和条件语句的处理。它可以用于实现条件判断、循环控制和异常处理等功能。

下面是一个简单的例子,演示了如何使用BEGIN...END语句块:

BEGIN  
    -- 打印语句1  
    PRINT 'This is statement 1';  
  
    -- 判断条件  
    IF (条件)  
    BEGIN  
        -- 打印语句2  
        PRINT 'This is statement 2';  
    END;  
  
    -- 循环控制  
    WHILE (条件)  
    BEGIN  
        -- 打印语句3  
        PRINT 'This is statement 3';  
    END;  
END;

在上面的例子中,BEGIN...END语句块包含三条打印语句和两个条件判断和循环控制结构。根据条件判断和循环控制的结构,只有满足条件时才会执行相应的代码块。

需要注意的是,BEGIN...END语句块必须以匹配的BEGIN和END关键字来结束,否则会导致语法错误。

IF…ELSE语句- 2.5.2 -

在T-SQL中,IF...ELSE语句用于根据条件执行不同的操作。它允许根据条件的结果选择性地执行代码块。

IF...ELSE语句的基本语法如下:

IF condition  
BEGIN  
    -- 条件为真时执行的代码块  
END  
ELSE  
BEGIN  
    -- 条件为假时执行的代码块  
END;

其中,condition是要评估的条件表达式。如果condition的值为真,则执行IF块中的代码;如果为假,则执行ELSE块中的代码。

以下是一个示例,演示如何使用IF...ELSE语句:

DECLARE @age INT = 25;  
  
IF @age < 18  
BEGIN  
    PRINT '你还未成年,不能投票。';  
END  
ELSE  
BEGIN  
    PRINT '你已经成年,可以投票。';  
END;

在上述示例中,声明了一个名为@age的整数变量,并将其初始化为25。然后,使用IF...ELSE语句判断年龄是否小于18岁。如果条件为真,则输出"你还未成年,不能投票。";否则,输出"你已经成年,可以投票。"。

需要注意的是,IF...ELSE语句只能处理两个条件的情况。如果需要处理多个条件,可以使用嵌套的IF...ELSE语句或CASE表达式来实现。

CASE语句- 2.5.3 -

在T-SQL中,CASE语句用于根据条件执行不同的操作。它类似于其他编程语言中的switch语句,允许根据条件的结果选择性地执行代码块。

CASE语句有两种形式:简单CASE语句和搜索CASE语句。

1. 简单CASE语句:

CASE expression  
    WHEN value1 THEN result1  
    WHEN value2 THEN result2  
    ...  
    ELSE resultN  
END

简单CASE语句根据expression的值与WHEN子句中的值进行比较,如果匹配,则执行相应的THEN子句中的代码块。如果没有匹配的值,则执行ELSE子句中的代码块(可选)。

以下是一个示例,演示如何使用简单CASE语句:

SELECT FirstName, LastName,  
       CASE Age  
           WHEN 18 THEN 'Adult'  
           WHEN 17 THEN 'Teenager'  
           ELSE 'Minor'  
       END AS AgeGroup  
FROM Customers;

上述示例根据Age列的值将Customers表中的行分为不同的年龄组,并返回每个客户的姓名和年龄组。

2. 搜索CASE语句:

CASE  
    WHEN condition1 THEN result1  
    WHEN condition2 THEN result2  
    ...  
    ELSE resultN  
END

搜索CASE语句根据每个WHEN子句中的条件进行判断,如果条件为真,则执行相应的THEN子句中的代码块。如果没有满足的条件,则执行ELSE子句中的代码块(可选)。

以下是一个示例,演示如何使用搜索CASE语句:

SELECT FirstName, LastName,  
       CASE  
           WHEN Age >= 18 THEN 'Adult'  
           WHEN Age >= 13 AND Age <= 17 THEN 'Teenager'  
           ELSE 'Minor'  
       END AS AgeGroup  
FROM Customers;

上述示例根据Age列的值将Customers表中的行分为不同的年龄组,并返回每个客户的姓名和年龄组。与简单CASE语句不同的是,搜索CASE语句使用条件表达式而不是具体的值进行比较。

WHILE语句- 2.5.4 -

T-SQL中的WHILE语句用于在满足指定条件时重复执行一段代码块。WHILE语句的基本语法如下:

WHILE condition  
BEGIN  
    -- 执行的代码块  
END

其中,condition是一个布尔表达式,当条件为真时,代码块会被重复执行。一旦条件为假,代码块将停止执行。

以下是一个示例,演示如何使用WHILE语句:

DECLARE @counter INT = 1;  
DECLARE @maxCounter INT = 10;  
  
WHILE @counter <= @maxCounter  
BEGIN  
    PRINT @counter;  
    SET @counter = @counter + 1;  
END;

上述示例中,声明了两个变量@counter和@maxCounter,并使用WHILE循环打印从1到10的数字。在循环内部,递增@counter的值,并在每次循环中打印它的当前值。当@counter的值大于@maxCounter时,循环停止执行。

GOTO语句- 2.5.5 -

在T-SQL中,GOTO语句用于无条件地将程序的执行跳转到指定的标签位置。GOTO语句通常与LABEL关键字一起使用,LABEL关键字用于定义一个标签,以供GOTO语句跳转时使用。

以下是T-SQL中GOTO语句的语法:

GOTO label;

其中,label是标签的名称。

以下是一个示例,演示了如何使用GOTO语句:

BEGIN  
    PRINT 'Start of the program.';  
    GOTO end_program;  
    PRINT 'This line will not be printed.';  
    GOTO another_label;  
    PRINT 'This line will not be printed.';  
    :another_label:  
    PRINT 'This line will be printed.';  
    :end_program:  
    PRINT 'End of the program.';  
END;

在上述示例中,程序首先打印"Start of the program.",然后使用GOTO语句跳转到名为end_program的标签位置。在跳转之后,程序会继续执行并打印"End of the program."。在跳转到another_label标签之前,GOTO语句之后的两条打印语句将不会被执行,因为它们位于跳转之后。

需要注意的是,过度使用GOTO语句会使代码难以理解和维护。在实际编程中,应该尽可能避免使用GOTO语句,以保持代码的结构清晰和可读性。

WAITFOR语句- 2.5.6 -

T-SQL中的WAITFOR语句用于暂停执行当前语句,直到指定的时间间隔或事件发生。它允许在T-SQL脚本中引入延迟或等待。

WAITFOR语句的基本语法如下:

WAITFOR DELAY 'time_interval';

或者

WAITFOR TIME 'time_to_wait';

其中,time_interval是一个时间间隔,以时间单位(如毫秒、秒、分钟等)表示。time_to_wait是一个等待时间,以时间格式(如'10:00:00')表示。

以下是一个示例,演示如何使用WAITFOR语句:

BEGIN  
    PRINT 'Start of the script.';  
    WAITFOR DELAY '00:00:10'; -- 等待10秒  
    PRINT '10 seconds have passed.';  
    WAITFOR TIME '15:30:00'; -- 等待到15:30:00时刻  
    PRINT 'Time is now 15:30:00.';  
    PRINT 'End of the script.';  
END;

在上述示例中,脚本首先打印"Start of the script.",然后使用WAITFOR DELAY语句等待10秒。接下来,它打印"10 seconds have passed."。然后,使用WAITFOR TIME语句等待到指定的时间点(15:30:00),并打印"Time is now 15:30:00."。最后,脚本打印"End of the script."并结束。

使用WAITFOR语句可以方便地在T-SQL脚本中引入延迟或等待,以满足特定的需求。

RETURN语句- 2.5.7 -

在T-SQL中,RETURN语句用于从存储过程、函数或批处理中返回一个值。它允许指定要返回的值,并将其传递给调用过程或查询。

RETURN语句的基本语法如下:

RETURN expression;

其中,expression是一个计算结果为标量值的表达式。

以下是一个示例,演示了如何在存储过程中使用RETURN语句:

CREATE PROCEDURE GetTotalOrders  
AS  
BEGIN  
    DECLARE @totalOrders INT;  
    SELECT @totalOrders = COUNT(*) FROM Orders;  
    RETURN @totalOrders;  
END;

在上述示例中,GetTotalOrders存储过程计算订单表中的总订单数,并将其存储在@totalOrders变量中。然后,使用RETURN语句返回该变量的值。

要调用这个存储过程并获取返回值,可以使用以下查询:

DECLARE @orderCount INT;    
EXEC @orderCount = GetTotalOrders;    
SELECT @orderCount;

上述查询将执行GetTotalOrders存储过程,并将返回的值存储在@orderCount变量中。最后,通过选择该变量来显示总订单数。