SQL SERVER中的流程控制语句

作者:springsnow 时间:2024-01-12 18:25:26 

T-SQL中用来编写流程控制模块的语句有:BEGIN...AND语句、IF...ELSE语句、CASE语句、WHILE语句、GOTO语句、BREAK语句、WAITFOR语句和RETURN语句。

批处理

一个批处理段是由一个或者多个语句组成的一个批处理,之所以叫批处理是因为所有语句一次性被提交到一个SQL实例。

  • 批处理是分批提交到SQL Server示例,因此在不同的批处理里局部变量不可访问。

  • 在不同批处理中,流程控制语句不能跨批处理。

  • 如果想让多个语句分多次提交到SQL实例,则需要使用GO关键字。GO关键字本身并不是一个SQL语句,GO关键字可以看作是一个批处理结束的标识符,当遇到GO关键字时,当前GO之前的语句会作为一个批处理直接传到SQL实例执行。

DECLARE @i int;
SET @i = 1;
GO        --分批了
PRINT @i  --@i在这个批里未定义

1、BEGIN...AND语句

语句块是多条Transact-SQL语句组成的代码段,从而可以执行一组Transact-SQL语句。经常与while或if...else组合起来使用,可以相互嵌套。

示例:

DECLARE @count INT
SELECT @count = 0
WHILE @count < 10
BEGIN
   PRINT 'count = ' + CONVERT(VARCHAR(10), @count)
   SELECT @count = @count + 1
END

PRINT 'loop finished, count = ' + CONVERT(VARCHAR(10), @count)

2、IF...ELSE语句

IF...ELSE语句用于在执行一组代码之前进行条件判断,根据判断的结果执行不同的代码。IF...ELSE语句语句对布尔表达式进行判断,如果布尔表达式返回为TRUE,则执行IF关键字后面的语句块;如果布尔表达式返回FALSE,则执行 ELSE关键字后面的语句块。

语法:

IF Boolean_expression
    { sql_statement | statement_block }
[ ELSE
    { sql_statement | statement_block } ]

示例:

DECLARE @score INT
SET @score = 100
IF @score >= 60
   PRINT '及格'
ELSE
   PRINT '不及格'

3、 CASE语句

CASE语句是多条件分支语句,相比IF...ELSE语句,CASE语句进行分支流程控制可以使代码更加清晰,易于理解。CASE语句根据表达式逻辑值的真假来决定执行的代码流程。

语法:

CASE input_expression
    WHEN when_expression THEN result_expression [ ...n ]
    [ ELSE else_result_expression ]
END

CASE
    WHEN Boolean_expression THEN result_expression [ ...n ]
    [ ELSE else_result_expression ]
END

示例:

DECLARE @score INT
SET @score = 100

SELECT CASE @score
           WHEN 100 THEN '满分'
           WHEN 60 THEN '及格'
       END
       AS '成绩'

或者

DECLARE @score INT
SET @score = 100

SELECT CASE
           WHEN @score >= 90 THEN '优秀'
           WHEN @score >= 80 THEN '良好'
           WHEN @score >= 70 THEN '中等'
           WHEN @score >= 60 THEN '及格'
           ELSE '不及格'
       END
       AS '成绩'

4、 WHILE语句

WHILE语句根据条件重复执行一条或多条T-SQL代码,只要条件表达式为真,就循环执行语句。可以使用 BREAK 和 CONTINUE 关键字在循环内部控制 WHILE 循环中语句的执行。

语法:

WHILE Boolean_expression
    { sql_statement | statement_block | BREAK | CONTINUE }

参数:

  • Boolean_expression:返回 TRUE 或 FALSE 的表达式。 如果布尔表达式中含有 SELECT 语句,则必须用括号将 SELECT 语句括起来。

  • {sql_statement | statement_block}:Transact-SQL 语句或用语句块定义的语句分组。 若要定义语句块,请使用控制流关键字 BEGIN 和 END。

  • BREAK:导致从最内层的 WHILE 循环中退出。 将执行出现在 END 关键字(循环结束的标记)后面的任何语句。

  • CONTINUE:使 WHILE 循环重新开始执行,忽略 CONTINUE 关键字后面的任何语句。

DECLARE @i int;
SET @i = 0;
WHILE(@i < 10)
BEGIN
   SET @i = @i + 1;
   IF(@i % 2 = 0)
   BEGIN
       PRINT('跳过2的倍数' + CAST(@i AS varchar));
       CONTINUE;
   END
   ELSE IF (@i = 7)
   BEGIN
       PRINT('到' + CAST(@i AS varchar) + '就跳出循环');
       BREAK;
   END
   PRINT @i;
END

5、无条件退出语句RETURN

RETURN语句用于使程序从一个查询、存储过程或批量处理中无条件返回,其后面的语句不再执行。如果在存储过程中使用return语句,那么此语句可以指定返回给调用应用程序、批处理或过程的负整数;如果没有为return指定整数值,那么该存储过程将返回0。

BEGIN
   PRINT(1);
   PRINT(2);
   RETURN;
   PRINT(3);    --在RETURN之后的代码不会被执行,因为会跳过当前批处理
END
GO
BEGIN
   PRINT(4);
END

6、无条件跳转语句GOTO

GOTO语句可以使程序无条件跳转到指定的程序执行点,增加了程序设计的灵活性。但破坏了程序的结构化,使程序结构变得复杂而且难以测试。

使用说明:语句标识符可以是数字或者字母的组合,但必须以":"结束。而在GOTO语句后的标识符不必带":"。

注意事项:GOTO语句和跳转标签可以在存储过程、批处理或语句块中的任何地方使用,但不能超出批处理的范围。

DECLARE @i int;

SET @i = 1;
SET @i = 2;
SET @i = 3;
SET @i = 4;
GOTO ME;
SET @i = 5;--这行被跳过了
SET @i = 6;--这行被跳过了
SET @i = 7;--这行被跳过了

ME:PRINT('跳到我了?');
PRINT @i

输出结果如下:

跳到我了?
4

7、WAITFOR语句

waitfor语句用于挂起语句的执行,直到指定的时间点或者指定的时间间隔。

语法:

WAITFOR
{
   DELAY 'time_to_pass'
 | TIME 'time_to_execute'
 | [ ( receive_statement ) | ( get_conversation_group_statement ) ]
   [ , TIMEOUT timeout ]
}

在waitfor语句中不能包含打开游标,定义视图这样的操作。在包含事务的语句中不要使用waitfor语句,因为waitfor语句在时间点或时间间隔执行期间将一直拥有对象的锁,当事务中包含waitfor语句,事务的其他语句又需要访问被锁住的数据对象事就容易发生死锁现象。

7.1 DELAY参数

DELAY参数指定了等待的时间段。不能指定天数,只能指定小时数、分钟数和秒数。允许延迟的最长时间为24小时。

WAITFOR DELAY '01:00'

将运行WAITFOR语句前的任何代码,然后到达WAITFOR语句,停止1小时,之后继续执行下一条语句中的代码。

7.2 TIME参数

TIME参数指定到达指定时间的等待时间。

WAITFOR TIME '01:00'

将运行WAITFOR语句前的任何代码,然后到达WAITFOR语句,直到凌晨1点停止执行,之后执行WAITFOR语句后的下一条语句。

来源:https://www.cnblogs.com/springsnow/p/10185972.html

标签:SQL,SERVER,T-SQL,流程,控制,语句
0
投稿

猜你喜欢

  • python 调用win32pai 操作cmd的方法

    2023-11-15 12:32:09
  • python过滤中英文标点符号的实例代码

    2022-11-09 13:43:09
  • Python+pyecharts绘制双动态曲线教程详解

    2023-03-04 09:19:48
  • php下使用iconv需要注意的问题

    2023-11-23 03:05:09
  • 用Dreamweaver设计限时自动关闭网页

    2009-07-10 13:13:00
  • Python用Try语句捕获异常的实例方法

    2021-07-14 10:28:54
  • vscode的几项基本配置详解

    2022-05-13 23:28:29
  • php实现汉字验证码和算式验证码的方法

    2024-06-07 15:50:15
  • 解决在Python编辑器pycharm中程序run正常debug错误的问题

    2023-09-09 09:58:39
  • 一个ASP写的侧边菜单栏

    2010-05-27 12:22:00
  • 微软建议的ASP性能优化28条守则(4)

    2008-02-26 17:57:00
  • 一起感受HTML5和CSS3的能量[译]

    2009-09-04 16:29:00
  • 在 WordPress 的页眉(header)和页脚(footer)添加代码方法

    2023-08-19 21:34:45
  • python网络爬虫精解之Beautiful Soup的使用说明

    2021-02-21 15:20:48
  • CentOS6.4上使用yum安装mysql

    2024-01-18 10:07:09
  • Sql Server 2005数据库被标记为“可疑”问题

    2009-12-15 10:50:00
  • Python 数据清洗删除缺失值替换缺失值详情

    2022-03-02 05:46:11
  • Python语法快速入门指南

    2021-10-18 11:36:00
  • Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容

    2023-04-01 15:20:05
  • vue不通过路由直接获取url中参数的方法示例

    2024-04-30 08:41:06
  • asp之家 网络编程 m.aspxhome.com