SQL SERVER中的流程控制语句


Posted in SQL Server onMay 25, 2022

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语句后的下一条语句。

到此这篇关于SQL SERVER流程控制语句的文章就介绍到这了。

SQL Server 相关文章推荐
SQL Server数据定义——模式与基本表操作
Apr 05 SQL Server
SQL Server连接查询的实用教程
Apr 07 SQL Server
SQLServer2008提示评估期已过解决方案
Apr 12 SQL Server
sql查询结果列拼接成逗号分隔的字符串方法
May 25 SQL Server
Sql Server之数据类型详解
Feb 28 SQL Server
详解在SQLPlus中实现上下键翻查历史命令的功能
Mar 18 SQL Server
sqlserver连接错误之SQL评估期已过的问题解决
Mar 23 SQL Server
sql server偶发出现死锁的解决方法
Apr 10 SQL Server
SQL Server Agent 服务无法启动
Apr 20 SQL Server
使用MybatisPlus打印sql语句
Apr 22 SQL Server
SQL Server中的游标介绍
May 20 SQL Server
SQL Server删除表中的重复数据
May 25 SQL Server
SQL Server中搜索特定的对象
May 25 #SQL Server
SQL Server使用T-SQL语句批处理
May 20 #SQL Server
SQL Server 中的事务介绍
May 20 #SQL Server
SQL Server中锁的用法
May 20 #SQL Server
SQL Server中使用表变量和临时表
May 20 #SQL Server
SQL Server中的游标介绍
May 20 #SQL Server
SQL Server #{}可以防止SQL注入
May 11 #SQL Server
You might like
PHP获取数组最大值下标的方法
2015/05/12 PHP
详解PHP数组赋值方法
2015/11/07 PHP
PHP dirname功能及原理实例解析
2020/10/28 PHP
一个JS翻页效果
2007/07/23 Javascript
有关jquery与DOM节点操作方法和属性记录
2016/04/15 Javascript
AngularJS 如何在控制台进行错误调试
2016/06/07 Javascript
Vue2.0利用 v-model 实现组件props双向绑定的优美解决方案
2017/03/13 Javascript
用原生JS实现简单的多选框功能
2017/06/12 Javascript
详解javascript 正则表达式之分组与前瞻匹配
2018/05/30 Javascript
20道JS原理题助你面试一臂之力(必看)
2019/07/22 Javascript
vue使用自定义事件的表单输入组件用法详解【日期组件与货币组件】
2020/06/01 Javascript
JQuery基于FormData异步提交数据文件
2020/09/01 jQuery
由浅入深讲解python中的yield与generator
2017/04/05 Python
简单谈谈Python中的元祖(Tuple)和字典(Dict)
2017/04/21 Python
Python set常用操作函数集锦
2017/11/15 Python
Python查找两个有序列表中位数的方法【基于归并算法】
2018/04/20 Python
Python判断对象是否相等及eq函数的讲解
2019/02/25 Python
基于sklearn实现Bagging算法(python)
2019/07/11 Python
python生成器推导式用法简单示例
2019/10/08 Python
在tensorflow中实现去除不足一个batch的数据
2020/01/20 Python
python让函数不返回结果的方法
2020/06/22 Python
Python pip 常用命令汇总
2020/10/19 Python
CSS代码检查工具stylelint的使用方法详解
2021/03/27 HTML / CSS
学院书画协会部门岗位职责
2013/12/01 职场文书
博士研究生自我鉴定范文
2013/12/04 职场文书
小小的船教学反思
2014/02/21 职场文书
大班幼儿评语大全
2014/04/30 职场文书
财会专业毕业生自荐信
2014/07/09 职场文书
大学生学习面向未来的赶考思想汇报
2014/09/12 职场文书
运动会广播稿200字
2014/10/18 职场文书
2015毕业生简历自我评价
2015/03/02 职场文书
社团个人总结范文
2015/03/05 职场文书
出纳岗位职责范本
2015/03/31 职场文书
幼儿园2015年度工作总结
2015/04/01 职场文书
2015年污水处理厂工作总结
2015/05/26 职场文书
SQL实现LeetCode(175.联合两表)
2021/08/04 MySQL