热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQL SERVER中的流程控制语句

这篇文章介绍了SQL SERVER中的流程控制语句,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

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流程控制语句的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 本文由编程笔记小编整理,主要介绍了使用Junit和黄瓜进行自动化测试中步骤缺失的问题。文章首先介绍了使用cucumber和Junit创建Runner类的代码,然后详细说明了黄瓜功能中的步骤和Steps类的实现。本文对于需要使用Junit和黄瓜进行自动化测试的开发者具有一定的参考价值。摘要长度:187字。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • MPLS VP恩 后门链路shamlink实验及配置步骤
    本文介绍了MPLS VP恩 后门链路shamlink的实验步骤及配置过程,包括拓扑、CE1、PE1、P1、P2、PE2和CE2的配置。详细讲解了shamlink实验的目的和操作步骤,帮助读者理解和实践该技术。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 本文介绍了关系型数据库和NoSQL数据库的概念和特点,列举了主流的关系型数据库和NoSQL数据库,同时描述了它们在新闻、电商抢购信息和微博热点信息等场景中的应用。此外,还提供了MySQL配置文件的相关内容。 ... [详细]
author-avatar
漂浪男孩2010_218
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有