SQL SERVER中的流程控制语句
作者:springsnow 发布时间:2024-01-12 18:25:26
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语句后的下一条语句。
来源:https://www.cnblogs.com/springsnow/p/10185972.html


猜你喜欢
- 前提:安装xhtml2pdf https://pypi.python.org/pypi/xhtml2pdf/下载字体:微软雅黑;待转换的文件
- 富文本编辑器,Rich Text Editor, 简称 RTE, 它提供类似于 Microsoft Word 的编辑功能,容易被不会编写 H
- 至于对好广告的评判,不同的人有不同的标准,一些人认为那些打动人、有新意、有共鸣的广告是好广告,另一些人的观点则是:观众喜欢与否,不是广告好与
- 做表单验证的时候是否会碰到验证某个输入框内只能填写数字呢,仅允许输入整数数字或者带小数点的数字。下面这段代码也许能帮到你!通过对当前输入框定
- selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题,selen
- 基本介绍pandas是Python数据挖掘、数据分析中常用的库。而DataFrame生成excel中的sheet表,以及在excel中增加s
- 前言使用的pyecharts是v1.0这里需要注意,pyecharts0.5的版本和v1.0以上的版本完全不一样,可以说是两个包该包能够方便
- 有时候会碰到需求,将字典来反转,即:字典中的键作为值,而字典中的值作为键。对于字典比较小,可以使用普通方法方法一:使用普通方法转换>&
- 把今天的学习的opencv知识先记录一下!运行环境是:pycharm话不多说,献上代码再说:import cv2 # openc
- 前言python爬虫系列文章的第3篇介绍了网络请求库神器 Requests ,请求把数据返回来之后就要提取目标数据,不同的网站返回的内容通常
- 这是个基于three.js的插件,预览地址:戳这里使用方法:1、这个插件的用法很简单,引入如下2个js<script src=&quo
- 刚我在做Tree view 绑定时自己摸索了一下,网上有人说TreeView绑定数据源,用什么递归绑定啥的,我不想看了,就自己试着写了一个我
- 在Visual Studio 中使用git——什么是Git(一)如果要使用git进行版本管理,其实使用git命令行工具就完全足够了,图形化工
- 前言如果你在寻找python工作,那你的面试可能会涉及Python相关的问题。通过对网络资料的收集整理,本文列出了100道python的面试
- queue介绍queue是python中的标准库,俗称队列。在python中,多个线程之间的数据是共享的,多个线程进行数据交换的时候,不能够
- 之前在一个web系统的设计中,和另一个设计师讨论,“保存”和“取消”按钮该怎么设计。我的观点是,保存是比取消更常用的按钮,也是用户的主要目的
- 下面说说主要实现思路: 1、存取图片 (1)、将图片文件转换为二进制并直接存进sql server //UploadHelper.cs //
- 前言在安装MySQL的时候会默认初始化几个MySQL运行所需的数据库:mysql, sys, information_schema, per
- 微信小程序报错VM1305:1 thirdScriptErrorCannot read property 'name' of
- 这个问题用了我整整一晚上的时间才解决,希望有人遇到和我一样的时能少走些弯路。启动Django,服务器拒绝访问,可以尝试以下方法解决:1. 没