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

    文章

    766

    浏览量

    44162
  • 数据库
    +关注

    关注

    7

    文章

    3816

    浏览量

    64457
收藏 人收藏

    评论

    相关推荐

    深入理解C语言:循环语句的应用与优化技巧

    在程序设计中,我们常常需要重复执行某一段代码。为了提高效率和简化代码,循环语句应运而生。C语言作为一门经典的编程语言,提供了多种循环控制结构,帮助程序员高效地实现重复操作。掌握循环语句的使用,不仅
    的头像 发表于 12-07 01:11 179次阅读
    深入理解C语言:循环<b class='flag-5'>语句</b>的应用与优化技巧

    SQL错误代码及解决方案

    SQL数据库开发和管理中,常见的错误代码及其解决方案可以归纳如下: 一、语法错误(Syntax Errors) 错误代码 :无特定代码,但通常会在错误消息中明确指出是语法错误。 原因 :SQL语句中
    的头像 发表于 11-19 10:21 1918次阅读

    LTspice的编程语句应该怎么写?

    有关LTspice电路仿真软件的使用,应该怎么编写一个变压器的语句,尤其是多路输出的,并且这个软件是否支持多路浮动电源输出,就像反激式开关电源那样副边多路浮地? 有关LTspice的软件使用有什么资料推荐,重点是关于编程语句编写的,就像上面那样两个电感的耦合关系那样实现变
    发表于 10-11 19:19

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-shell脚本编写之流程控制

    1、条件语句shell语句流程控制与C语言不一样,流程控制中不能为空。shell中if语法如下,其中confition表示条件判断式,command为程序段落。if else语法
    发表于 09-05 09:06

    飞凌嵌入式ElfBoard ELF 1板卡-shell脚本编写之流程控制

    1、条件语句 shell语句流程控制与C语言不一样,流程控制中不能为空。 shell中if语法如下,其中confition表示条件判断式,command为程序段落。 if else
    发表于 09-04 10:12

    IP 地址在 SQL 注入攻击中的作用及防范策略

    SQL 注入是通过将恶意的 SQL 代码插入到输入参数中,欺骗应用程序执行这些恶意代码,从而实现对数据库的非法操作。例如,在一个登录表单中,如果输入的用户名被直接拼接到 SQL 查询语句中
    的头像 发表于 08-05 17:36 324次阅读

    如何限制IPD语句中的最大字节数?

    当数据可用时,我正在使用带有 IP 和 PORT 的扩展 IPD 语句。 我的问题是,如何限制 IPD 语句中的最大字节数? 当我尝试从服务器作为客户端检索数据时,响应包含大约 20k 的数据,在
    发表于 07-17 06:06

    求助,为什么STM32CUBEIDE中的GCC编译器不提示if语句中的错误信息?

    STM32cubeIDE中的GCC编译器,在如下语句,因为输错了,但GCC没有提示错误信息,只提示了一个警告信息,如何设置能提示? uint8_ti=0; uint8_tk=0
    发表于 04-07 08:47

    鸿蒙TypeScript入门学习第6天:【条件语句

    条件语句用于基于不同的条件来执行不同的动作。 TypeScript 条件语句是通过一条或多条语句的执行结果(True 或 False)来决定执行的代码块。
    的头像 发表于 04-01 13:51 768次阅读
    鸿蒙TypeScript入门学习第6天:【条件<b class='flag-5'>语句</b>】

    assign语句和always语句的用法

    Assign语句和Always语句是在硬件描述语言(HDL)中常用的两种语句,用于对数字电路建模和设计。Assign语句用于连续赋值,而Always
    的头像 发表于 02-22 16:24 2622次阅读

    深入探讨嵌入式C编程的goto语句

    什么是goto语句? goto 语句被称为 C 语言中的跳转语句。 用于无条件跳转到其他标签。它将控制权转移到程序的其他部分。 goto
    发表于 01-21 10:41 614次阅读
    深入探讨嵌入式C编程的goto<b class='flag-5'>语句</b>

    mysql8.0流程控制介绍

      流程控制介绍 解决复杂问题不可能通过一个SQL语句完成,我们需要执行多个SQL操作。流程控制语句
    的头像 发表于 01-13 10:36 714次阅读

    default在单片机中有什么作用

    在单片机中,default关键字的作用是为了在switch语句中处理default情况下的代码逻辑。switch语句是一种选择结构,根据给定的表达式值,选择不同的分支执行不同的代码。当switch
    的头像 发表于 01-08 10:11 1350次阅读

    单片机if是什么语句

    单片机中的if语句是一种条件语句,用于根据不同的条件执行不同的代码块。在程序执行过程中,条件语句用来决定是否执行特定的代码段。在单片机编程中,if语句是最常见和最基础的一种条件
    的头像 发表于 01-05 14:04 1832次阅读

    单片机中for语句的运用

    单片机中的for语句是一种常见的循环控制结构,用于重复执行一段代码块,可以简化程序的编写和减少代码量。本文将详细介绍单片机中for语句的运用。 一、for语句的基本结构和功能 for
    的头像 发表于 01-05 14:02 2502次阅读