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小时内删除。