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 08 SQL Server
SQLServer 日期函数大全(小结)
Apr 08 SQL Server
sqlserver2017共享功能目录路径不可改的解决方法
Apr 16 SQL Server
如何有效防止sql注入的方法
May 25 SQL Server
sql字段解析器的实现示例
Jun 23 SQL Server
数据库之SQL技巧整理案例
Jul 07 SQL Server
sql通过日期判断年龄函数的示例代码
Jul 16 SQL Server
sql server删除前1000行数据的方法实例
Aug 30 SQL Server
SQL SERVER触发器详解
Feb 24 SQL Server
sql时间段切分实现每隔x分钟出一份高速门架车流量
Feb 28 SQL Server
如何使用SQL Server语句创建表
Apr 12 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&amp;MYSQL分页原理及实现
2007/01/02 PHP
php strlen mb_strlen计算中英文混排字符串长度
2009/07/10 PHP
PHP水印类,支持添加图片、文字、填充颜色区域的实现
2017/02/04 PHP
PHP面向对象五大原则之里氏替换原则(LSP)详解
2018/04/08 PHP
tp框架(thinkPHP)实现三次登陆密码错误之后锁定账号功能示例
2018/05/24 PHP
IE中直接运行显示当前网页中的图片 推荐
2006/08/31 Javascript
jquery插件jquery.beforeafter.js实现左右拖拽分隔条对比图片的方法
2015/08/07 Javascript
jquery实现触发时更新下拉列表内容的方法
2015/12/02 Javascript
a标签跳转到指定div,jquery添加和移除class属性的实现方法
2016/10/10 Javascript
jQuery滚动监听实现商城楼梯式导航效果
2017/03/06 Javascript
详解nodejs中的process进程
2017/03/19 NodeJs
微信小程序商城项目之侧栏分类效果(1)
2017/04/17 Javascript
Js利用Canvas实现图片压缩功能
2017/09/13 Javascript
mpvue 如何使用腾讯视频插件的方法
2018/07/16 Javascript
vue.js 实现点击按钮动态添加li的方法
2018/09/07 Javascript
2种在vue项目中使用百度地图的简单方法
2018/09/28 Javascript
详解vue项目中实现图片裁剪功能
2019/06/07 Javascript
20个必会的JavaScript面试题(小结)
2019/07/02 Javascript
JavaScript实现猜数字游戏
2020/05/20 Javascript
Python递归遍历列表及输出的实现方法
2015/05/19 Python
Python SQLite3简介
2018/02/22 Python
python自动重试第三方包retrying模块的方法
2018/04/24 Python
Django开发中的日志输出的方法
2018/07/02 Python
python lambda函数及三个常用的高阶函数
2020/02/05 Python
美国浴缸、水槽和水龙头购物网站:Vintage Tub & Bath
2019/11/05 全球购物
J2ee常用的设计模式?说明工厂模式
2015/05/21 面试题
公司中秋节活动方案
2014/02/12 职场文书
老公给老婆的保证书
2014/04/28 职场文书
医院合作协议书
2014/08/19 职场文书
车间主任岗位职责范本
2015/04/08 职场文书
教师节班会开场白
2015/06/01 职场文书
运动会开幕式通讯稿
2015/07/18 职场文书
初中班主任培训心得体会
2016/01/07 职场文书
《揠苗助长》教学反思
2016/02/20 职场文书
Python爬取英雄联盟MSI直播间弹幕并生成词云图
2021/06/01 Python
斗罗大陆八大特殊魂兽,龙族始祖排榜首,第五最残忍(翠魔鸟)
2022/03/18 国漫