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 相关文章推荐
SqlServer: 如何更改表的文件组?(进而改变存储位置)
Apr 05 SQL Server
sqlserver2017共享功能目录路径不可改的解决方法
Apr 16 SQL Server
SqlServer 垂直分表(减少程序改动)
Apr 16 SQL Server
数据库之SQL技巧整理案例
Jul 07 SQL Server
利用 SQL Server 过滤索引提高查询语句的性能分析
Jul 15 SQL Server
SQL中的三种去重方法小结
Nov 01 SQL Server
Sql Server 行数据的某列值想作为字段列显示的方法
Apr 20 SQL Server
SQL Server 忘记密码以及重新添加新账号
Apr 26 SQL Server
SQL Server中锁的用法
May 20 SQL Server
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
May 25 SQL Server
SQL Server携程核心系统无感迁移到MySQL实战
Jun 01 SQL Server
在SQL Server中使用 Try Catch 处理异常的示例详解
Jul 15 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
为查询结果建立向后/向前按钮
2006/10/09 PHP
PhpDocumentor 2安装以及生成API文档的方法
2014/05/21 PHP
PHP5.3以上版本安装ZendOptimizer扩展
2015/03/27 PHP
PHP使用fopen与file_get_contents读取文件实例分享
2016/03/04 PHP
PHP+Ajax异步带进度条上传文件实例
2016/11/01 PHP
jquery获取复选框被选中的值
2014/03/22 Javascript
用jquery修复在iframe下的页面锚点失效问题
2014/08/22 Javascript
JavaScript控制按钮可用或不可用的方法
2015/04/03 Javascript
非常实用的js验证框架实现源码 附原理方法
2016/06/08 Javascript
vue.js模仿京东省市区三级联动的选择组件实例代码
2017/11/22 Javascript
element-ui多文件上传的实现示例
2019/04/10 Javascript
JavaScript实现选项卡效果的分析及步骤
2019/04/16 Javascript
微信小程序bindinput与bindsubmit的区别实例分析
2019/04/17 Javascript
详解JavaScript 浮点数运算的精度问题
2019/07/23 Javascript
解决layer.open后laydate失效的问题
2019/09/06 Javascript
JavaScript中的null和undefined用法解析
2019/09/30 Javascript
你不可不知的Vue.js列表渲染详解
2019/10/01 Javascript
Vue实现push数组并删除的例子
2019/11/01 Javascript
微信小程序实现音频文件播放进度的实例代码
2020/03/02 Javascript
快速解决vue2+vue-cli3项目ie兼容的问题
2020/11/17 Vue.js
python获取当前用户的主目录路径方法(推荐)
2017/01/12 Python
Python编程实现双链表,栈,队列及二叉树的方法示例
2017/11/01 Python
Python Web程序部署到Ubuntu服务器上的方法
2018/02/22 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
2019/05/27 Python
python文字转语音实现过程解析
2019/11/12 Python
python的Jenkins接口调用方式
2020/05/12 Python
英国最大的体育&时尚零售公司:JD Sports
2017/12/13 全球购物
eDreams意大利:南欧领先的在线旅行社
2018/11/23 全球购物
自荐信的五个重要部分
2013/10/29 职场文书
服装设计行业个人的自我评价
2013/12/20 职场文书
简历自我评价模版
2014/01/31 职场文书
学习雷锋精神演讲稿
2014/05/10 职场文书
劳模事迹材料范文
2014/12/24 职场文书
公司保密管理制度
2015/08/04 职场文书
优秀班干部主要事迹材料
2015/11/04 职场文书
Python爬虫 简单介绍一下Xpath及使用
2022/04/26 Python