T-SQL 控制流语句

转载:http://www.cnblogs.com/kissdodog/archive/2013/03/10/2953232.html

控制流语句

控制流语句
  批处理:

    一个批处理段是由一个或者多个语句组成的一个批处理,之所以叫批处理是因为所有语句一次性被提交到一个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、程序块语句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
 

  批处理:

    一个批处理段是由一个或者多个语句组成的一个批处理,之所以叫批处理是因为所有语句一次性被提交到一个SQL实例。

  •     批处理是分批提交到SQL Server示例,因此在不同的批处理里局部变量不可访问。
  •     在不同批处理中,流程控制语句不能跨批处理。
  •     如果想让多个语句分多次提交到SQL实例,则需要使用GO关键字。GO关键字本身并不是一个SQL语句,GO关键字可以看作是一个批处理结束的标识符,当遇到GO关键字时,当前GO之前的语句会作为一个批处理直接传到SQL实例执行。  

  不同的批处理局部变量不可访问,例如:

  DECLARE @i int;
  SET @i = 1;
  GO        --分批了
  PRINT @i  [email protected]在这个批里未定义

  输出:

消息 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、程序块语句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

分类:

时间: 2024-10-11 12:45:59

T-SQL 控制流语句的相关文章

sql 中常见的控制流语句

控制流语句:1 begin .....end  2 if ...else  例如:if exists (select * from 表名称 ) begin selct * from  表名称 end 3 while  break countinue while语句用于设置重复执行的sql语句或者语句块continue语句可以让语句跳过contunue 语句之后的语句回到while循环的第一行break语句则让程序完全跳出循环结束while循环的执行. 例如: declare @a int dec

sqlserver控制流语句

批处理: 一个批处理段是由一个或者多个语句组成的一个批处理,之所以叫批处理是因为所有语句一次性被提交到一个SQL实例. 批处理是分批提交到SQL Server示例,因此在不同的批处理里局部变量不可访问. 在不同批处理中,流程控制语句不能跨批处理. 如果想让多个语句分多次提交到SQL实例,则需要使用GO关键字.GO关键字本身并不是一个SQL语句,GO关键字可以看作是一个批处理结束的标识符,当遇到GO关键字时,当前GO之前的语句会作为一个批处理直接传到SQL实例执行. 不同的批处理局部变量不可访问,

Hibernate 关于执行sql查询语句(转)

原文  http://www.yshjava.cn/post/543.html 主题 SQLHibernate Hibernate对原生SQL查询的支持和控制是通过SQLQuery接口实现的.通过Session接口,我们能够很方便的创建一个SQLQuery(SQLQuery是一个接口,在Hibernate4.2.2之前,默认返回的是SQLQuery的实现类--SQLQueryImpl对象,在下文中出现的SQLQuery如非注明,都是指该子类)对象来进行原生SQL查询: session.creat

java基础-控制流语句

一般情况下,代码的执行按照从上到下的顺序,然而通过加入一些判断,循环和跳转语句,你可以有条件地执行特定的语句. 接下来分三部分介绍Java的控制流语句,他们是判断语句(if-then, if-then-else, switch),循环语句(for, while, do-while)和跳转语句(break, continue, return). 判断语句 if-then语句 if-then语句是控制流语句中最基本的语句,它告诉程序如果制定的条件为true,则执行一段特定代码. if-then-el

Oracle 基本SQL SELECT语句

SELECT  *  |    {   [ DISTINCT  ]    column   |    expression   [   alias   ]  ,   ...    } FROM  table; ?SELECT  标识 选择哪些列. ?FROM    标识从哪个表中选择. column后面加上空格,同时跟上别名(alias),或者 as 别名,到下一行的内容时,要用逗号隔开, 默认的别名是小写的,如果想要让它是大写的,使用 "别名" 如果别名有多个单词的时候,用双引号别名

Sql去重语句

海量数据(百万以上),其中有些全部字段都相同,有些部分字段相同,怎样高效去除重复? 如果要删除手机(mobilePhone),电话(officePhone),邮件(email)同时都相同的数据,以前一直使用这条语句进行去重: 1 delete from 表 where id not in 2 (select max(id) from 表 group by mobilePhone,officePhone,email ) 3 or 4 delete from 表 where id not in 5

SQL join语句

——转载 假设我们有下面两张表.表A在左边,表B在右边.我们给它们各四条记录. 1 2 3 4 5 6 id name       id  name -- ----       --  ---- 1  Pirate     1   Rutabaga 2  Monkey     2   Pirate 3  Ninja      3   Darth Vader 4  Spaghetti  4   Ninja 我们用过name字段用几种不同方式把这些表联合起来,看能否得到和那些漂亮的韦恩图在概念上的匹

图解MYSQL JOIN ON,SQL JOIN 详解,数据库sql join语句

对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Coding Horror上有一篇文章(实在不清楚为什么Coding Horror也被墙)通过 文氏图 Venn diagrams 解释了SQL的Join.我觉得清楚易懂,转过来. 假设我们有两张表. Table A 是左边的表. Table B 是右边的表. 其各有四条记录,其中有两条记录是相同的,如下所示

SQL 常用语句

–-表现最差的前10名使用查询 SELECT TOP 10 ProcedureName = t.text, ExecutionCount = s.execution_count, AvgExecutionTime = isnull ( s.total_elapsed_time / s.execution_count, 0 ), AvgWorkerTime = s.total_worker_time / s.execution_count, TotalWorkerTime = s.total_wo