0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

T-SQL语句中流程控制语句的系统讲解

西西 来源:博客园 作者:宋沄剑 2020-09-22 15:52 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

和其他高级语言一样,T-SQL中也有用于控制流程的语句。T-SQL中的流程控制语句进一步扩展了T-SQL的力量……使得大部分业务逻辑可以在数据库层面进行。但很多人对T-SQL中的流程控制语句并没有系统的了解,本篇文章会系统的对T-SQL语句中的流程控制语句进行系统讲解。

基本概念

在没有流程控制语句的情况下,T-SQL语句是按照从上到下的顺序逐个执行:

使用流程控制语句可以让开发人员可以基于某些逻辑进行选择性的跳转,实现了类似高级语言的跳转结构:

流程控制语句的使用范围和GO关键字

流程控制语句只能在单个批处理段(Batch),用户自定义函数和存储过程中使用。不能跨多个批处理段或者用户自定义函数和存储过程。

因为这里重点讲到T-SQL查询语句,所以这里只讲批处理段(Batch).

一个批处理段是由一个或者多个语句组成的一个批处理,之所以叫批处理是因为所有语句一次性被提交到一个SQL实例。在这个批处理范围内,局部变量是互相可见的。

而想让多个语句分多次提交到SQL实例,则需要使用GO关键字。GO关键字本身并不是一个SQL语句,GO关键字可以看作是一个批处理结束的标识符,当遇到GO关键字时,当前GO之前的语句会作为一个批处理直接传到SQL实例执行。所以不在同一个批处理内局部变量不可见,也不可对跨批处理的语句使用流程控制语句.

在同一个批处理中局部变量互相可见:

在不同批处理中局部变量不可见:

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

T-SQL中的8个流程控制语句关键字

在T-SQL中,与流程控制语句相关的关键字有8个:

BEGIN...END BREAK
GOTO CONTINUE
IF...ELSE WHILE
RETURN WAITFOR

下面对上述关键字进行挨个讲解

BEGIN…END关键字

BEGIN…END关键字也是流程控制语句需要用到的最基本关键字,用于将多个语句划分成逻辑上的一部分。其实可以直接理解成类C语言中的花括号(“{}"“)

WHILE/BREAK/CONTINUE关键字

在T-SQL的流程控制语句中,循环语句只有WHILE循环,并没有传统高级语言的FOR和SWITCH循环。WHILE除了被用于流程控制语句的循环之外,还经常被用于游标之中。

WHILE关键字和高级语言中的WHILE关键字几乎完全一样。WHILE循环中可以利用BREAK和CONTINUE关键字对循环进行控制。

CONTINUE关键字用于结束本次循环,直接开始下一次循环。

BREAK关键字用于直接跳出WHILE循环语句。

这里值得注意的是,当WHILE循环嵌套时,CONTINUE关键字和BREAK关键字只会作用于它们所处的WHILE循环之内,不会对外部WHILE循环产生作用。

一个简单的例子如下:从1循环到10,当循环到7时,结束本次循环并继续,当循环到8时,跳出循环

IF..ELSE关键字

IF..ELSE关键字实现了非此既彼的逻辑。和高级语言中的IF..ELSE具有完全一样的使用方法,这里就不再讲述了,例子参看上图。

还有要注意的是IF经常会和EXISTS关键字相结合来查看数据表中指定的数据是否存在,比如:

我想查询员工中没有上级的人,如果有这个人,则输出“XXX is our boss”,如果没有,则输出"There is no infomation about our boss”

GOTO关键字

GOTO关键字因为能打乱程序的整个流程而在高级语言中臭名卓著。GOTO关键字的使用非常简单,定义一个跳转标签,只要GOTO 标签名就可以。如果说一定要使用GOTO关键字的话,最佳实践是只使用在错误处理上,比如:

RETURN关键字

Return是最简单有效直接无条件告诉服务器跳出某个批处理段(Batch),用户自定义函数和存储过程的方式。在同一个批处理中Return关键字直接截止当前Return所在的批处理(Batch),批处理有关概念请参考前面GO关键字那一节.

简单的Return概念如下例子:

在存储过程中,Return语句后面可以返回数字用于返回执行状态或者错误代码。

很多人会把Return语句和RAISERROR函数搞混,区别在于RAISERROR函数会引发错误,并且程序依然会往下执行:

WAITFOR关键字

WAITFOR关键字允许指定语句在特定时间或是推迟特定时间执行。

推迟等待和在特定时间执行的语法分别是WAITFOR DELAY ‘需要等待的执行时间',WAITFOR TIME ‘需要执行程序的精确时间’

简单的语法例子如下:

WAITFOR的功能可以实现更为复杂的业务逻辑,比如:

我想开始一项促销活动,在当前时间10小时后开始,为8折,20小时后结束,变为9折:

总结

本篇文章从T-SQL查询的角度讲解了流程控制语句的8个关键字。利用好这些关键字是掌握复杂T-SQL查询的必要条件。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SQL
    SQL
    +关注

    关注

    1

    文章

    807

    浏览量

    46959
  • 数据库
    +关注

    关注

    7

    文章

    4085

    浏览量

    68565
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    MySQL慢查询调优指南

    MySQL慢查询是数据库性能问题的最常见原因。当一条SQL语句执行超过1秒时,就可能影响用户体验;超过10秒时,通常会收到用户投诉;而超过30秒的查询,往往意味着系统存在严重的性能问题。本文从实
    的头像 发表于 04-09 10:01 199次阅读

    NineData SQL AI 智能补全上线:写 SQL,不必每次都从头敲

    NineData推出SQLAI智能补全功能,通过AI技术实现上下文感知的SQL语句智能提示。该功能不仅能补全关键字,还能根据当前输入内容预测后续查询意图,显著提升多表关联、复杂条件等场景下的编写效率
    的头像 发表于 04-01 20:19 329次阅读
    NineData <b class='flag-5'>SQL</b> AI 智能补全上线:写 <b class='flag-5'>SQL</b>,不必每次都从头敲

    C语言中实现函数宏的三种方式

    在宏的第一个分号后便结束。即 a = b 和 b = tmp 均不受控制语句所作用。 因此,在工程中,一般使用三种方式来对函数宏进行封装,分别为 {}、do{...}while(0
    发表于 12-29 07:34

    芯趋势 | AI 在制程控制中的演进:从基础 SPC 到智能体 AI 系统

    半导体行业正经历一场由AI主导的制程控制革命!从沿用多年的传统统计方法,到如今复杂的智能体协同系统,每一步演进都在改写行业的效率与控制规则。要知道,在统计制程控制(SPC)、先进制
    的头像 发表于 12-16 10:24 975次阅读
    芯趋势 | AI 在制<b class='flag-5'>程控制</b>中的演进:从基础 SPC 到智能体 AI <b class='flag-5'>系统</b>

    条件的执行语句

    条件执行语句大多在if语句中使用,也在使用关系运算符(<,==,>等) 或者布尔值表达式(,!等)计算复杂表达式时使用。对于包含函数调 用的代码片段,由于函数返回值会被
    发表于 12-12 08:25

    C语言的分支结构介绍

    1.简单if语句 C语言中的分支结构语句中的if条件语句。 简单if语句的基本结构如下: 代码语言:javascript if(表达式) { 执行代码块; } 其语义是:如
    发表于 11-25 07:48

    GD32F470使用__attribute__语句,keil编译通过但是scons编译不通过,为什么?

    问题语句: uint16_t ltdc_lcd_framebuf0[800][480] __attribute__((at(LCD_FRAME_BUF_ADDR))); 上述语句在keil编译
    发表于 10-14 06:05

    不用编程不用联网,实现倍福(BECKHOFF)PLC对接SQL数据库,上报和查询数据的案例

    消息区域显示的状态消息;根据状态消息调试。如下图:智能网关根据以上配置自动生成SQL语句命令,结合数据库相关参数对接到服务器,多个SQL语句用\'任务组\'区分,相同的任务组即为同一个
    发表于 10-10 11:14

    人工智能行业如何使用for循环语句进行循环

    : 支持range()函数生成数字序列 可结合else语句使用 Java中的for循环: 传统结构:for(初始化; 条件; 增量) 增强for循环:for(类型 变量 : 集合) 主要用于数组和集合
    的头像 发表于 09-10 12:55 709次阅读

    助力工业物联网升级,智能远程控制系统功不可没

    在工业4.0的浪潮中,工业物联网(IIoT)正从概念走向规模化落地,而智能远程控制系统作为其核心组件,如同“神经传导中枢”,将分散的设备、数据与决策端紧密连接。跨越时空的精准操作,都依赖于智能远程控制系统
    的头像 发表于 08-06 16:23 1204次阅读

    Unicore标准NEMA语句GSA及说明

    本文介绍和芯星通的NEMA语句说明。
    的头像 发表于 07-16 11:39 854次阅读
    Unicore标准NEMA<b class='flag-5'>语句</b>GSA及说明

    是德示波器MSOX3054T程控制自动化测试

    实现自动化测试,助力测试流程的智能化升级。   一、MSOX3054T的核心优势:远程控制的基础 MSOX3054T示波器具备出色的信号采集与分析能力,其高频带宽、高采样率及深存储深度
    的头像 发表于 07-08 17:09 778次阅读
    是德示波器MSOX3054<b class='flag-5'>T</b>远<b class='flag-5'>程控制</b>自动化测试

    基础篇3:掌握Python中的条件语句与循环

    在Python编程语言中,条件语句和循环是构成复杂逻辑和数据处理的基石。本篇基础教程将帮助您深入了解Python中的条件语句和循环结构,让您能够更好地控制程序流程。 条件
    发表于 07-03 16:13

    大促数据库压力激增,如何一眼定位 SQL 执行来源?

    语句成为了性能瓶颈。面对这样的困境,本篇文章提出了对 SQL 进行 “染色” 的方法来帮助大家 一眼定位问题 SQL,而无需再在多处逻辑中辗转腾挪 。本文的思路主要受之前郭忠强老师发布的 如何一眼定位
    的头像 发表于 06-10 11:32 676次阅读
    大促数据库压力激增,如何一眼定位 <b class='flag-5'>SQL</b> 执行来源?

    详解TIA Portal SCL编程语言中的IF语句

    IF 语句是编程中最基本和最重要的控制结构之一,它的主要作用是根据条件决定程序的执行路径,IF 语句是编程中实现逻辑判断和决策的基础。
    的头像 发表于 05-24 15:01 2189次阅读
    详解TIA Portal SCL编程语言中的IF<b class='flag-5'>语句</b>