时间:2021-07-01 10:21:17 帮助过:9人阅读
批处理:
一个批处理段是由一个或者多个语句组成的一个批处理,之所以叫批处理是因为所有语句一次性被提交到一个SQL实例。
不同的批处理局部变量不可访问,例如:
- <span style="color: #0000ff;"> DECLARE <span style="color: #008000;">@i <span style="color: #0000ff;">int<span style="color: #000000;">;
- <span style="color: #0000ff;">SET <span style="color: #008000;">@i <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">1<span style="color: #000000;">;
- <span style="color: #0000ff;">GO <span style="color: #339966;">--分批了
- <span style="color: #0000ff;">PRINT <span style="color: #008000;">@i <span style="color: #ff0000;">--@i在这个批里未定义</span></span></span></span></span></span></span></span></span></span></span></span></span></span>
输出:
- <span style="color: #ff0000;">消息 <span style="font-weight: bold;">137,级别 <span style="font-weight: bold;">15,状态 <span style="font-weight: bold;">2,第 <span style="font-weight: bold;">1 行
- 必须声明标量变量 "@i"。</span></span></span></span></span>
控制流语句不能跨批处理,例如:
- <span style="color: #0000ff;"> DECLARE <span style="color: #008000;">@i <span style="color: #0000ff;">int<span style="color: #000000;">;
- <span style="color: #0000ff;">SET <span style="color: #008000;">@i <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">1<span style="color: #000000;">;
- <span style="color: #0000ff;">IF(<span style="color: #008000;">@i <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">1<span style="color: #000000;">)
- <span style="color: #0000ff;">PRINT(<span style="color: #ff0000;">‘<span style="color: #ff0000;">1<span style="color: #ff0000;">‘<span style="color: #000000;">);
- <span style="color: #0000ff;">GO <span style="color: #008000;">--分批了
- <span style="color: #0000ff;">ELSE
- <span style="color: #0000ff;">PRINT(<span style="color: #ff0000;">‘<span style="color: #ff0000;">不知道<span style="color: #ff0000;">‘); <span style="color: #008000;">--ELSE找不到IF了,控制流语句不跨批,因此报错。</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
输出结果如下:
- <span style="color: #800000; font-weight: bold;">1<span style="color: #ff0000;">
- 消息 <span style="font-weight: bold;">156,级别 <span style="font-weight: bold;">15,状态 <span style="font-weight: bold;">1,第 <span style="font-weight: bold;">1 行
- 关键字 ‘ELSE‘ 附近有语法错误。</span></span></span></span></span></span>
控制流语句也称为流程控制语句,是和高级编程语言中的类似功能一致的,引入控制流语句将使T-SQL代码有顺序执行转变为按控制执行。
1、程序块语句BEGIN...END
程序块语句用于将多条T-SQL语句封装起来构成一个程序块。SQLServer在处理时,将整个程序块视为一条T-SQL语句执行。
- <span style="color: #0000ff;">begin
- <span style="color: #808080;"> <T<span style="color: #808080;">-SQL命令行或程序块<span style="color: #808080;">>
- <span style="color: #0000ff;">end</span></span></span></span></span>
经常与while或if...else组合起来使用,可以相互嵌套。
2、判断语句IF...ELSE
if...else语句用于条件测试,系统将根据条件满足与否来决定如何执行语句,else子句是可选的。
语法:
- <span style="color: #0000ff;">if<span style="color: #000000;"> 逻辑表达式
- 语句块1
- <span style="color: #0000ff;">else<span style="color: #000000;">
- 语句块2
- 语句块3</span></span></span></span>
if的形式通常包括if exists(用于判断是否存在)和if not(是否条件不满足)
综合示例:
- <span style="color: #0000ff;">DECLARE <span style="color: #008000;">@i <span style="color: #0000ff;">int
- <span style="color: #0000ff;">SET <span style="color: #008000;">@i <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">10<span style="color: #000000;">;
- <span style="color: #0000ff;">IF(<span style="color: #008000;">@i <span style="color: #808080;">< <span style="color: #800000; font-weight: bold;">5<span style="color: #000000;">)
- <span style="color: #0000ff;">PRINT <span style="color: #ff0000;">‘<span style="color: #ff0000;">小于5<span style="color: #ff0000;">‘<span style="color: #000000;">;
- <span style="color: #0000ff;">ELSE <span style="color: #0000ff;">IF(<span style="color: #008000;">@i <span style="color: #808080;">< <span style="color: #800000; font-weight: bold;">8<span style="color: #000000;">)
- <span style="color: #0000ff;">BEGIN
- <span style="color: #0000ff;">PRINT <span style="color: #ff0000;">‘<span style="color: #ff0000;">小于8<span style="color: #ff0000;">‘
- <span style="color: #0000ff;">END
- <span style="color: #0000ff;">ELSE
- <span style="color: #0000ff;">BEGIN
- <span style="color: #0000ff;">PRINT <span style="color: #ff0000;">‘<span style="color: #ff0000;">前面都不满足!<span style="color: #ff0000;">‘
- <span style="color: #0000ff;">END</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
以上代码在SQL Server中执行后输出前面都不满足!
3、循环语句WHILE
while语句用于执行循环,可以根据循环条件重复执行语句块。通常使用break和continue关键字在循环内部进行控制。
语法:
- <span style="color: #0000ff;">while<span style="color: #808080;"><条件表达式<span style="color: #808080;">>
- <span style="color: #808080;"><sql语句块1<span style="color: #808080;">>
- <span style="color: #ff0000;">[<span style="color: #ff0000;">break<span style="color: #ff0000;">]
- <span style="color: #808080;"><sql语句块2<span style="color: #808080;">>
- <span style="color: #ff0000;">[<span style="color: #ff0000;">continue<span style="color: #ff0000;">]
- <span style="color: #808080;"><sql语句块3<span style="color: #808080;">></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
break语句让程序跳出循环体,结束while的循环。
continue语句让程序跳过[sql语句块3],回到while<条件表达式>,重新判断逻辑值执行。
where语句可以互相嵌套。
示例:
- <span style="color: #0000ff;">DECLARE <span style="color: #008000;">@i <span style="color: #0000ff;">int<span style="color: #000000;">;
- <span style="color: #0000ff;">SET <span style="color: #008000;">@i <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">0<span style="color: #000000;">;
- <span style="color: #0000ff;">WHILE(<span style="color: #008000;">@i <span style="color: #808080;">< <span style="color: #800000; font-weight: bold;">10<span style="color: #000000;">)
- <span style="color: #0000ff;">BEGIN
- <span style="color: #0000ff;">SET <span style="color: #008000;">@i <span style="color: #808080;">= <span style="color: #008000;">@i <span style="color: #808080;">+ <span style="color: #800000; font-weight: bold;">1<span style="color: #000000;">;
- <span style="color: #0000ff;">IF(<span style="color: #008000;">@i <span style="color: #808080;">% <span style="color: #800000; font-weight: bold;">2 <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">0<span style="color: #000000;">)
- <span style="color: #0000ff;">BEGIN
- <span style="color: #0000ff;">PRINT(<span style="color: #ff0000;">‘<span style="color: #ff0000;">跳过2的倍数<span style="color: #ff0000;">‘ <span style="color: #808080;">+ <span style="color: #ff00ff;">CAST(<span style="color: #008000;">@i <span style="color: #0000ff;">AS <span style="color: #0000ff;">varchar<span style="color: #000000;">));
- <span style="color: #0000ff;">CONTINUE<span style="color: #000000;">;
- <span style="color: #0000ff;">END
- <span style="color: #0000ff;">ELSE <span style="color: #0000ff;">IF (<span style="color: #008000;">@i <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">7<span style="color: #000000;">)
- <span style="color: #0000ff;">BEGIN
- <span style="color: #0000ff;">PRINT(<span style="color: #ff0000;">‘<span style="color: #ff0000;">到<span style="color: #ff0000;">‘ <span style="color: #808080;">+ <span style="color: #ff00ff;">CAST(<span style="color: #008000;">@i <span style="color: #0000ff;">AS <span style="color: #0000ff;">varchar) <span style="color: #808080;">+ <span style="color: #ff0000;">‘<span style="color: #ff0000;">就跳出循环<span style="color: #ff0000;">‘<span style="color: #000000;">);
- <span style="color: #0000ff;">BREAK<span style="color: #000000;">;
- <span style="color: #0000ff;">END
- <span style="color: #0000ff;">PRINT <span style="color: #008000;">@i<span style="color: #000000;">;
- <span style="color: #0000ff;">END</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
输出结果如下所示:
- <span style="color: #800000; font-weight: bold;">1<span style="color: #000000;">
- 跳过2的倍数2
- <span style="color: #800000; font-weight: bold;">3<span style="color: #000000;">
- 跳过2的倍数4
- <span style="color: #800000; font-weight: bold;">5<span style="color: #000000;">
- 跳过2的倍数6
- 到7就跳出循环</span></span></span></span></span></span>
4、分支判断语句CASE
CASE语句用于执行多条件的分支判断。
语法格式:
- <span style="color: #ff00ff;">CASE<span style="color: #000000;"> input_expression
- <span style="color: #0000ff;">WHEN<span style="color: #000000;"> when_expression
- <span style="color: #0000ff;">THEN<span style="color: #000000;"> result_expression
- <span style="color: #ff0000;">[<span style="color: #ff0000;">...n<span style="color: #ff0000;">]
- <span style="color: #ff0000;">[<span style="color: #ff0000;">
- ELSE else_result_expression
- <span style="color: #ff0000;">]
- <span style="color: #0000ff;">END</span></span></span></span></span></span></span></span></span></span></span></span></span>
现在来写个实例:先给出一张表:
要求查出以下信息:
SQL语句如下:
- <span style="color: #0000ff;">select Team,Rq, <span style="color: #ff00ff;">sum(<span style="color: #ff00ff;">case <span style="color: #0000ff;">when winlose<span style="color: #808080;">=<span style="color: #ff0000;">‘<span style="color: #ff0000;">胜<span style="color: #ff0000;">‘ <span style="color: #0000ff;">then <span style="color: #800000; font-weight: bold;">1 <span style="color: #0000ff;">else <span style="color: #800000; font-weight: bold;">0 <span style="color: #0000ff;">end) <span style="color: #0000ff;">as 胜,<span style="color: #ff00ff;">sum(<span style="color: #ff00ff;">case <span style="color: #0000ff;">when winlose<span style="color: #808080;">=<span style="color: #ff0000;">‘<span style="color: #ff0000;">负<span style="color: #ff0000;">‘ <span style="color: #0000ff;">then <span style="color: #800000; font-weight: bold;">1 <span style="color: #0000ff;">else <span style="color: #800000; font-weight: bold;">0 <span style="color: #0000ff;">end) <span style="color: #0000ff;">as<span style="color: #000000;"> 负
- <span style="color: #0000ff;">from<span style="color: #000000;"> test
- <span style="color: #0000ff;">group <span style="color: #0000ff;">by<span style="color: #000000;"> Rq,Team
- <span style="color: #0000ff;">having Team <span style="color: #808080;">= <span style="color: #ff0000;">‘<span style="color: #ff0000;">曼联<span style="color: #ff0000;">‘</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
再来一个,一张表只有Id,Sex两个字段,要求用一条SQL语句将Sex字段的‘男‘变‘女‘,‘女‘变‘男‘。
- <span style="color: #0000ff;">update<span style="color: #000000;"> table_1
- <span style="color: #0000ff;">set sex <span style="color: #808080;">= (<span style="color: #ff00ff;">case <span style="color: #0000ff;">when sex<span style="color: #808080;">=<span style="color: #ff0000;">‘<span style="color: #ff0000;">男<span style="color: #ff0000;">‘ <span style="color: #0000ff;">then <span style="color: #ff0000;">‘<span style="color: #ff0000;">女<span style="color: #ff0000;">‘ <span style="color: #0000ff;">when sex<span style="color: #808080;">=<span style="color: #ff0000;">‘<span style="color: #ff0000;">女<span style="color: #ff0000;">‘ <span style="color: #0000ff;">then <span style="color: #ff0000;">‘<span style="color: #ff0000;">男<span style="color: #ff0000;">‘ <span style="color: #0000ff;">end)</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
执行完SQL语句后,结果如下:
再来一个有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分,英语58分,请用一条sql语句查询出这三条记录大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。
SQL语句如下:
- <span style="color: #0000ff;">select<span style="color: #000000;"> Id,
- (<span style="color: #ff00ff;">case
- <span style="color: #0000ff;">when chinese <span style="color: #808080;">>= <span style="color: #800000; font-weight: bold;">80 <span style="color: #0000ff;">then <span style="color: #ff0000;">‘<span style="color: #ff0000;">优秀<span style="color: #ff0000;">‘
- <span style="color: #0000ff;">when chinese <span style="color: #808080;">>= <span style="color: #800000; font-weight: bold;">60 <span style="color: #0000ff;">then <span style="color: #ff0000;">‘<span style="color: #ff0000;">及格<span style="color: #ff0000;">‘
- <span style="color: #0000ff;">else <span style="color: #ff0000;">‘<span style="color: #ff0000;">不及格<span style="color: #ff0000;">‘
- <span style="color: #0000ff;">end) <span style="color: #0000ff;">as<span style="color: #000000;"> 语文,
- (<span style="color: #ff00ff;">case
- <span style="color: #0000ff;">when math <span style="color: #808080;">>= <span style="color: #800000; font-weight: bold;">80 <span style="color: #0000ff;">then <span style="color: #ff0000;">‘<span style="color: #ff0000;">优秀<span style="color: #ff0000;">‘
- <span style="color: #0000ff;">when math <span style="color: #808080;">>= <span style="color: #800000; font-weight: bold;">60 <span style="color: #0000ff;">then <span style="color: #ff0000;">‘<span style="color: #ff0000;">及格<span style="color: #ff0000;">‘
- <span style="color: #0000ff;">else <span style="color: #ff0000;">‘<span style="color: #ff0000;">不及格<span style="color: #ff0000;">‘
- <span style="color: #0000ff;">end) <span style="color: #0000ff;">as<span style="color: #000000;"> 数学,
- (<span style="color: #ff00ff;">case
- <span style="color: #0000ff;">when english <span style="color: #808080;">>= <span style="color: #800000; font-weight: bold;">80 <span style="color: #0000ff;">then <span style="color: #ff0000;">‘<span style="color: #ff0000;">优秀<span style="color: #ff0000;">‘
- <span style="color: #0000ff;">when english <span style="color: #808080;">>= <span style="color: #800000; font-weight: bold;">60 <span style="color: #0000ff;">then <span style="color: #ff0000;">‘<span style="color: #ff0000;">及格<span style="color: #ff0000;">‘
- <span style="color: #0000ff;">else <span style="color: #ff0000;">‘<span style="color: #ff0000;">不及格<span style="color: #ff0000;">‘
- <span style="color: #0000ff;">end) <span style="color: #0000ff;">as<span style="color: #000000;"> 英语
- <span style="color: #0000ff;">from fenshu</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
5、无条件退出语句RETURN
RETURN语句用于使程序从一个查询、存储过程或批量处理中无条件返回,其后面的语句不再执行。如果在存储过程中使用return语句,那么此语句可以指定返回给调用应用程序、批处理或过程的整数;如果没有为return指定整数值,那么该存储过程将返回0。
存储过程返回值:
返回值 | 含义 |
0 | 存储过程执行成功 |
-1 | 没有找到数据库对象 |
-2 | 数据类型错误 |
-3 | 进程死锁错误 |
-4 | 进程死锁错误 |
-5 | 语法错误 |
-6 | 其他用户错误 |
-7 | 资源错误 |
-8 | 非致命的内部错误 |
-9 | 达到系统配置参数极限 |
-10 | 内部一致性致命错误 |
-11 | 内部一致性致命错误 |
-12 | 表或索引崩溃 |
-13 | 数据库崩溃 |
-14 | 硬件错误 |
语法:
- <span style="color: #0000ff;"> return <span style="color: #ff0000;">[<span style="color: #ff0000;">整数表达式<span style="color: #ff0000;">]</span></span></span></span>
示例:
- <span style="color: #0000ff;">BEGIN
- <span style="color: #0000ff;">PRINT(<span style="color: #800000; font-weight: bold;">1<span style="color: #000000;">);
- <span style="color: #0000ff;">PRINT(<span style="color: #800000; font-weight: bold;">2<span style="color: #000000;">);
- <span style="color: #0000ff;">RETURN<span style="color: #000000;">;
- <span style="color: #0000ff;">PRINT(<span style="color: #800000; font-weight: bold;">3); <span style="color: #008000;">--在RETURN之后的代码不会被执行,因为会跳过当前批处理
- <span style="color: #0000ff;">END
- <span style="color: #0000ff;">GO
- <span style="color: #0000ff;">BEGIN
- <span style="color: #0000ff;">PRINT(<span style="color: #800000; font-weight: bold;">4<span style="color: #000000;">);
- <span style="color: #0000ff;">END</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
输出如下:
?
1
2
4
|
6、无条件跳转语句GOTO
GOTO语句可以使程序无条件跳转到指定的程序执行点,增加了程序设计的灵活性。但破坏了程序的结构化,使程序结构变得复杂而且难以测试。
语法:
- <span style="color: #0000ff;"> GOTO 语句标识符</span>
使用说明:
语句标识符可以是数字或者字母的组合,但必须以":"结束。而在GOTO语句后的标识符不必带":"。
注意事项:
GOTO语句和跳转标签可以在存储过程、批处理或语句块中的任何地方使用,但不能超出批处理的范围。
示例:
- <span style="color: #0000ff;">DECLARE <span style="color: #008000;">@i <span style="color: #0000ff;">int<span style="color: #000000;">;
- <span style="color: #0000ff;">SET <span style="color: #008000;">@i <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">1<span style="color: #000000;">;
- <span style="color: #0000ff;">SET <span style="color: #008000;">@i <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">2<span style="color: #000000;">;
- <span style="color: #0000ff;">SET <span style="color: #008000;">@i <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">3<span style="color: #000000;">;
- <span style="color: #0000ff;">SET <span style="color: #008000;">@i <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">4<span style="color: #000000;">;
- <span style="color: #0000ff;">GOTO<span style="color: #000000;"> ME;
- <span style="color: #0000ff;">SET <span style="color: #008000;">@i <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">5<span style="color: #000000;">; <span style="color: #008000;">--这行被跳过了
- <span style="color: #0000ff;">SET <span style="color: #008000;">@i <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">6<span style="color: #000000;">; <span style="color: #008000;">--这行被跳过了
- <span style="color: #0000ff;">SET <span style="color: #008000;">@i <span style="color: #808080;">= <span style="color: #800000; font-weight: bold;">7<span style="color: #000000;">; <span style="color: #008000;">--这行被跳过了
- ME:<span style="color: #0000ff;">PRINT(<span style="color: #ff0000;">‘<span style="color: #ff0000;">跳到我了?<span style="color: #ff0000;">‘<span style="color: #000000;">);
- <span style="color: #0000ff;">PRINT <span style="color: #008000;">@i</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
输出结果如下:
?
跳到我了?
4
|
7、延期执行语句WAITFOR
waitfor语句用于挂起语句的执行,直到指定的时间点或者指定的时间间隔。
1、指定时间点的语法
- <span style="color: #0000ff;">waitfor<span style="color: #000000;">
- {
- Time <span style="color: #ff0000;">‘<span style="color: #ff0000;">time<span style="color: #ff0000;">‘<span style="color: #000000;">
- }</span></span></span></span></span></span>
示例:
- <span style="color: #0000ff;"> WAITFOR DELAY <span style="color: #ff0000;">‘<span style="color: #ff0000;">00:00:03<span style="color: #ff0000;">‘
- <span style="color: #0000ff;">BEGIN
- <span style="color: #0000ff;">PRINT <span style="color: #ff0000;">‘<span style="color: #ff0000;">延迟3秒输出!<span style="color: #ff0000;">‘<span style="color: #000000;">;
- <span style="color: #0000ff;">END</span></span></span></span></span></span></span></span></span></span></span>
2、指定等待时间间隔的语法
- <span style="color: #0000ff;">waitfor<span style="color: #000000;">
- {
- delay <span style="color: #ff0000;">‘<span style="color: #ff0000;">interval<span style="color: #ff0000;">‘<span style="color: #000000;">
- }</span></span></span></span></span></span>
interval为时间间隔,指定执行waitfor语句之前需要等待的时间,最多为24小时。
waitfor语句常用语某个特定的时间点或时间间隔自动执行某些任务。在waitfor语句中不能包含打开游标,定义视图这样的操作。在包含事务的语句中不要使用waitfor语句,因为waitfor语句在时间点或时间间隔执行期间将一直拥有对象的锁,当事务中包含waitfor语句,事务的其他语句又需要访问被锁住的数据对象事就容易发生死锁现象。
示例:对着始终来看真是分毫不差啊。
- <span style="color: #0000ff;"> WAITFOR TIME <span style="color: #ff0000;">‘<span style="color: #ff0000;">15:49:22<span style="color: #ff0000;">‘
- <span style="color: #0000ff;">BEGIN
- <span style="color: #0000ff;">PRINT <span style="color: #ff0000;">‘<span style="color: #ff0000;">定时输出<span style="color: #ff0000;">‘
- <span style="color: #0000ff;">END</span></span></span></span></span></span></span></span></span></span>
T-SQL 控制流语句
标签: