T-SQL 控制流语句
批处理:
一个批处理段是由一个或者多个语句组成的一个批处理,之所以叫批处理是因为所有语句一次性被提交到一个SQL实例。
- 批处理是分批提交到SQL Server示例,因此在不同的批处理里局部变量不可访问。
- 在不同批处理中,流程控制语句不能跨批处理。
- 如果想让多个语句分多次提交到SQL实例,则需要使用GO关键字。GO关键字本身并不是一个SQL语句,GO关键字可以看作是一个批处理结束的标识符,当遇到GO关键字时,当前GO之前的语句会作为一个批处理直接传到SQL实例执行。
不同的批处理局部变量不可访问,例如:
DECLARE @i int;
SET @i = 1;
GO --分批了
PRINT @i --@i在这个批里未定义
输出:
消息 137,级别 15,状态 2,第 1 行
必须声明标量变量 "@i"。
控制流语句不能跨批处理,例如:
DECLARE @i int;
SET @i = 1;
IF(@i = 1)
PRINT('');
GO --分批了
ELSE
PRINT('不知道'); --ELSE找不到IF了,控制流语句不跨批,因此报错。
输出结果如下:
1
消息 156,级别 15,状态 1,第 1 行
关键字 'ELSE' 附近有语法错误。
控制流语句也称为流程控制语句,是和高级编程语言中的类似功能一致的,引入控制流语句将使T-SQL代码有顺序执行转变为按控制执行。
1、程序块语句BEGIN...END
程序块语句用于将多条T-SQL语句封装起来构成一个程序块。SQLServer在处理时,将整个程序块视为一条T-SQL语句执行。
begin
<T-SQL命令行或程序块>
end
经常与while或if...else组合起来使用,可以相互嵌套。
2、判断语句IF...ELSE
if...else语句用于条件测试,系统将根据条件满足与否来决定如何执行语句,else子句是可选的。
语法:
if 逻辑表达式
语句块1
else
语句块2
语句块3
if的形式通常包括if exists(用于判断是否存在)和if not(是否条件不满足)
综合示例:
DECLARE @i int
SET @i = 10;
IF(@i < 5)
PRINT '小于5';
ELSE IF(@i < 8)
BEGIN
PRINT '小于8'
END
ELSE
BEGIN
PRINT '前面都不满足!'
END
以上代码在SQL Server中执行后输出前面都不满足!
3、循环语句WHILE
while语句用于执行循环,可以根据循环条件重复执行语句块。通常使用break和continue关键字在循环内部进行控制。
语法:
while<条件表达式>
<sql语句块1>
[break]
<sql语句块2>
[continue]
<sql语句块3>
break语句让程序跳出循环体,结束while的循环。
continue语句让程序跳过[sql语句块3],回到while<条件表达式>,重新判断逻辑值执行。
where语句可以互相嵌套。
示例:
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
输出结果如下所示:
1
跳过2的倍数2
3
跳过2的倍数4
5
跳过2的倍数6
到7就跳出循环
4、分支判断语句CASE
CASE语句用于执行多条件的分支判断。
语法格式:
CASE input_expression
WHEN when_expression
THEN result_expression
[...n]
[
ELSE else_result_expression
]
END
现在来写个实例:先给出一张表:
要求查出以下信息:
SQL语句如下:
select Team,Rq, sum(case when winlose='胜' then 1 else 0 end) as 胜,sum(case when winlose='负' then 1 else 0 end) as 负
from test
group by Rq,Team
having Team = '曼联'
再来一个,一张表只有Id,Sex两个字段,要求用一条SQL语句将Sex字段的'男'变'女','女'变'男'。
update table_1
set sex = (case when sex='男' then '女' when sex='女' then '男' end)
执行完SQL语句后,结果如下:
再来一个有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。
SQL语句如下:
select Id,
(case
when chinese >= 80 then '优秀'
when chinese >= 60 then '及格'
else '不及格'
end) as 语文,
(case
when math >= 80 then '优秀'
when math >= 60 then '及格'
else '不及格'
end) as 数学,
(case
when english >= 80 then '优秀'
when english >= 60 then '及格'
else '不及格'
end) as 英语
from fenshu
5、无条件退出语句RETURN
RETURN语句用于使程序从一个查询、存储过程或批量处理中无条件返回,其后面的语句不再执行。如果在存储过程中使用return语句,那么此语句可以指定返回给调用应用程序、批处理或过程的整数;如果没有为return指定整数值,那么该存储过程将返回0。
存储过程返回值:
返回值 | 含义 |
0 | 存储过程执行成功 |
-1 | 没有找到数据库对象 |
-2 | 数据类型错误 |
-3 | 进程死锁错误 |
-4 | 进程死锁错误 |
-5 | 语法错误 |
-6 | 其他用户错误 |
-7 | 资源错误 |
-8 | 非致命的内部错误 |
-9 | 达到系统配置参数极限 |
-10 | 内部一致性致命错误 |
-11 | 内部一致性致命错误 |
-12 | 表或索引崩溃 |
-13 | 数据库崩溃 |
-14 | 硬件错误 |
语法:
return [整数表达式]
示例:
BEGIN
PRINT(1);
PRINT(2);
RETURN;
PRINT(3); --在RETURN之后的代码不会被执行,因为会跳过当前批处理
END
GO
BEGIN
PRINT(4);
END
输出如下:
1
2
4
6、无条件跳转语句GOTO
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语句用于挂起语句的执行,直到指定的时间点或者指定的时间间隔。
1、指定时间点的语法
waitfor
{
Time 'time'
}
示例:
WAITFOR DELAY '00:00:03'
BEGIN
PRINT '延迟3秒输出!';
END
2、指定等待时间间隔的语法
waitfor
{
delay 'interval'
}
interval为时间间隔,指定执行waitfor语句之前需要等待的时间,最多为24小时。
waitfor语句常用语某个特定的时间点或时间间隔自动执行某些任务。在waitfor语句中不能包含打开游标,定义视图这样的操作。在包含事务的语句中不要使用waitfor语句,因为waitfor语句在时间点或时间间隔执行期间将一直拥有对象的锁,当事务中包含waitfor语句,事务的其他语句又需要访问被锁住的数据对象事就容易发生死锁现象。
示例:对着始终来看真是分毫不差啊。
WAITFOR TIME '15:49:22'
BEGIN
PRINT '定时输出'
END
T-SQL 控制流语句的更多相关文章
- sql 中常见的控制流语句
控制流语句:1 begin .....end 2 if ...else 例如:if exists (select * from 表名称 ) begin selct * from 表名称 end ...
- SQL循环语句 详解
SQL循环语句 declare @i int set @i=1 while @i<30 begin insert into test (userid) values(@i) set @i=@i+ ...
- T-SQL 之 控制流语句
控制流语句也称为流程控制语句,是和高级编程语言中的类似功能一致的,引入控制流语句将使T-SQL代码有顺序执行转变为按控制执行. 批处理:一个批处理段是由一个或者多个语句组成的一个批处理,之所以叫批处理 ...
- SQL CASE语句的使用
SQL CASE语句的使用 CASE是一个控制流语句,其作用与IF-THEN-ELSE语句非常相似,可根据数据选择值. CASE语句遍历条件并在满足第一个条件时返回值. 因此,一旦条件成立,它将短路, ...
- [转]MySQL 最基本的SQL语法/语句
MySQL 最基本的SQL语法/语句,使用mysql的朋友可以参考下. DDL-数据定义语言(Create,Alter,Drop,DECLARE) DML-数据操纵语言(Select,Delete ...
- SQL入门语句之ORDER BY 和GROUP BY
一.SQL入门语句之ORDER BY ORDER BY 是用来基于一个或多个列按升序或降序顺序排列数据 1.从数据库表获取全部数据按字段A的升序排列 select *from table_name o ...
- SQL入门语句之LIKE、GLOB和LIMIT
一.SQL入门语句之LIKE LIKE用来匹配通配符指定模式的文本值.如果搜索表达式与模式表达式匹配,LIKE 运算符将返回真(true),也就是 1.这里有两个通配符与 LIKE 运算符一起使用,百 ...
- SQL入门语句之SELECT和WHERE
一.SQL入门语句之SELECT SELECT语句用于从数据库表中获取数据,结果表的形式返回数据.这些结果表也被称为结果集 1.从数据库表中取部分字段 select 字段A,字段B from tabl ...
- SQL入门语句之INSERT、UPDATE和DELETE
一.SQL入门语句之INSERT insert语句的功能是向数据库的某个表中插入一个新的数据行 1.根据对应的字段插入相对应的值 insert into table_name(字段A, 字段B, 字段 ...
随机推荐
- ASP.NET JSON的序列化和反序列化 之 Newtonsoft.Json
我们用到的类库为:Newtonsoft.Json,通过VS工具中NuGet程序包可以下载. 一:对象转json-序列化 public class Student { public int ID { g ...
- 论前端css初始化的重要性
新手,求喷,刚刚知道每个浏览器都有对 标签的初始化,就造成我们网站开发者开发的web程序,会在不同的网站上有不同的样式风格,这给用户带来了很不好的体验,这也是浏览器本身的原因造成的,这时候,我们不可能 ...
- (ternary operator)三元运算符.
ternary operator: advantage: make a terse simple conditional assignment statement of if-then-else. d ...
- Deep Learning 学习随记(七)Convolution and Pooling --卷积和池化
图像大小与参数个数: 前面几章都是针对小图像块处理的,这一章则是针对大图像进行处理的.两者在这的区别还是很明显的,小图像(如8*8,MINIST的28*28)可以采用全连接的方式(即输入层和隐含层直接 ...
- java基础之抽象类与接口的区别
在学习java的过程中,或者是在找工作笔试或面试的时候,如果你是java岗位,那么抽象类与接口的区别无疑是一个大热点,是各大公司都想要考的一个小知识点,下面是我为了9月份秋招自己总结的,若有不对的地方 ...
- Vijos1675 NOI2005 聪聪和可可 记忆化搜索
简单题,结果因为理解错题意懵逼了好久…… moveTo[x][y]表示聪聪在节点x,可可在节点y时,聪聪下一步应到达哪一个节点 dp[x][y]表示聪聪在节点x,可可在节点y,且轮到可可行动时,所需时 ...
- SGU 199 Beautiful People(DP+二分)
时间限制:0.25s 空间限制:4M 题意: 有n个人,每个人有两个能力值,只有一个人的两个能力都小于另一个的能力值,这两个人才能共存,求能同时共存的最大人数. Solution: 显然这是一个两个关 ...
- directsound 应用实例
sdk里边有个文件夹Samples\C++\XInput\AudioController这个就是
- 入门1:PHP的优点
一.语法简单 二.学习成本低 (因为语法简单 所以学习成本低) 三.开发效率高 (PHP运行流程很简单,语法也很简单,必然开发效率就高) 四.跨平台 (我们只需要写一份PHP的程序,就可以非常方便的把 ...
- Linux on ASUS N550JK4700
实际上,ASUS N550JK对Ubuntu 14.04的兼容性是相当好的,包括无线网卡.蓝牙.键盘背光的调节.触摸板的开关.音量的键盘调节都是安装后无需配置直接可以使用的,这是出乎意料的,因为这些功 ...