T-SQL之流程控制语句(1)
批处理:
⼀个批处理段是由⼀个或者多个语句组成的⼀个批处理,之所以叫批处理是因为所有语句⼀次性被提交到⼀个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('1');
GO--分批了
ELSE
PRINT('不知道'); --ELSE不到IF了,控制流语句不跨批,因此报错。
输出结果如下:
1
消息156,级别15,状态1,第1⾏
关键字 'ELSE' 附近有语法错误。
控制流语句也称为流程控制语句,是和⾼级编程语⾔中的类似功能⼀致的,引⼊控制流语句将使T-SQL代码有顺序执⾏转变为按控制执⾏。
1、程序块语句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;
sql存储过程实例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='胜'then1else0end) as胜,sum(case when winlose='负'then1else0end) 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 >=80then'优秀'
when chinese >=60then'及格'
else'不及格'
end) as语⽂,
(case
when math >=80then'优秀'
when math >=60then'及格'
else'不及格'
end) as数学,
(case
when english >=80then'优秀'
when english >=60then'及格'
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、指定时间点的语法
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论