zoukankan      html  css  js  c++  java
  • 流程控制语句

    T-SQL中的11个流程控制语句关键字

        在T-SQL中,与流程控制语句相关的关键字有11个:

    BEGIN...END   BREAK
     GOTO  CONTINUE
     IF...ELSE WHILE
     RETURN  WAITFOR
     CASLE  RAISEERROR和PRINT

                

    BEGIN…END关键字

      BEGIN…END也是流程控制语句需要用到的最基本关键字,用于将多个语句划分成逻辑上的一部分。其实可以直接理解成Delphi的begin...end  或者C类语言的{},用于按块(block)顺次执行多条语句。

    IF..ELSE关键字

       IF..ELSE关键字实现了非此既彼的逻辑。和高级语言中的IF..ELSE具有完全一样的使用方法,这里就不再讲述了,例子参看上图。

        还有要注意的是IF经常会和EXISTS关键字相结合来查看数据表中指定的数据是否存在,比如:

        我想查询员工中没有上级的人,如果有这个人,则输出“XXX is our boss”,如果没有,则输出"There is no infomation about our boss”

        6

    WHILE/BREAK/CONTINUE关键字

       在T-SQL的流程控制语句中,循环语句只有WHILE循环,并没有传统高级语言的FOR和SWITCH循环。WHILE除了被用于流程控制语句的循环之外,还经常被用于游标之中。

       WHILE关键字和高级语言中的WHILE关键字几乎完全一样。WHILE循环中可以利用BREAK和CONTINUE关键字对循环进行控制。

       CONTINUE关键字用于结束本次循环,直接开始下一次循环。

       BREAK关键字用于直接跳出WHILE循环语句。

       这里值得注意的是,当WHILE循环嵌套时,CONTINUE关键字和BREAK关键字只会作用于它们所处的WHILE循环之内,不会对外部WHILE循环产生作用。

     语法:

      WHILE:    

      WHILE Boolean_expression

             sql_statements

    例:一下WHILE循环体被执行了三次。

    DECLARE @x int

          SET @x=0

        WHILE @x<3

    BEGIN

       @x=@X+1

    PRINT 'x='+CONVERT(char(1),@x)

    END
     
    BREAK   用于跳出最内存的WHILE循环
    DECLARE @x int
        SET @x=0
        WHILE @x<3
    BEGIN
       @x=@X+1
       PRINT 'x='+CONVERT(char(1),@x)
       BREAK                      /*此时跳出WHILE循环体只打印出x=1*/
    END
    CONTINUE   用于重新开始一次WHILE循环,在CONTINUE语句后面的语句都不在执行
    DECLARE @x int
        SET @x=0
        WHILE @x<3
    BEGIN
       @x=@X+1
       PRINT 'x='+CONVERT(char(1),@x)
       IF(@X=2)CONTINUE  
    /*如果@x!=2则会打印一下语句,否则不会执行下一条命令*/
       PRINT 'X IS NOT 2'                 
    END

    WAITFOR关键字

        WAITFOR关键字允许指定语句在特定时间或是推迟特定时间执行,也就是将它之后的语句在一个指定的间隔之后执行,或未来的某个指定时间执行。

        语法: WAITFOR {DELAY 'time'|TIME 'time'}

        推迟等待和在特定时间执行的语法分别是WAITFOR DELAY ‘需要等待的执行时间',WAITFOR TIME ‘需要执行程序的精确时间’

        可以简单的理解为:DELAY  时间段    TIME时间点

        简单的语法例子如下:

        8

       WAITFOR的功能可以实现更为复杂的业务逻辑,比如:

       我想开始一项促销活动,在当前时间10小时后开始,为8折,20小时后结束,变为9折:

    DECLARE @StartTime DATATIME
    DECLARE @EndTime DATATIME
    SET @StartTime=CAST(GETDATA()+'10:00:00'AS DATATIME)/*定义开始时间*/
    SET @EndTime=CAST(GETDATA()+'20:00:00'AS DATATIME)   /*定义结束时间*/
    WAITFOR TIME @StartTime
    BEGIN
      UPDATE Goods SET price=price*0.8 /*8折*/
    END
    WAITFOR TIME @EndtTime
    BEGIN
      UPDATE Goods SET price=price*0.9/*9折*/
    END

    GOTO关键字

     GOTO关键字的使用非常简单,定义一个跳转标签,只要GOTO 标签名就可以。如果说一定要使用GOTO关键字的话,最佳实践是只使用在错误处理上。

    GOTO的标号语法:label:

        7

    RETURN关键字

        Return是最简单有效直接无条件告诉服务器跳出某个批处理段(Batch),用户自定义函数和存储过程的方式。在同一个批处理中Return关键字直接截止当前Return所在的批处理(Batch),和BREAK很相似,但是有一点不同,RETURN可以返回一个整数,语法如下:RETURN [integer_expression],在学到存储过程的时候会提到。

        简单的Return概念如下例子:

        10

         在存储过程中,Return语句后面可以返回数字用于返回执行状态或者错误代码。

         很多人会把Return语句和RAISERROR函数搞混,区别在于RAISERROR函数会引发错误,并且程序依然会往下执行:

         11

    CASE

       CASE表达式可以根据多个选择确定执行内容。CASE表达式有两种形式:

    简单表达式:

    CASE input_expression

    WHEN when_expression THEN result_expression[...n]

    [ELSE else_result_expression]

    END

    选择表达式:

    CASE

     WHEN Boolean_expression THEN result_expression[...n]

    [ELSE else_result_expression]

    END

    例:1.简单表达式运用

    USE Market
    GO
    SELECT Name AS GoodsName,
    GoodsStatus=
    CASE Status
    WHEN 1 THEN '正在包装,尚不能出售'
    WHEN 0 THEN '可以出售'
    ELSE '未知状态'
    END
    FROM Goods
     
     

    2.选择表达式运用

    USE Market
    SELECT Name AS GoodsName,
    StorageStatus=
    CASE
    WHEN Storage=0 THEN '没有库存'
    WHEN Storage<300 THEN '库存较少'
    WHEN Storage>=300 AND Storage<1000 THEN '库存正常'
    ELSE '库存过量'
    END
    FROM Goods

     PRINT
    PRINT关键字的作用是屏幕上显示用户消息
    语法:

    例如:打印一个局部变量@MyMsg
    DECLARE @MyMsg char(20)
    SET @MyMsg='This is my message.'
    PRINT @
    MyMsg 

    RAISERROR
    RAISERROR关键字是一个比PRINT关键字功能更强大的返回信息语句。它的作用是将错误信息显示在屏幕上,同时也可以记录在NT日志中。RAISERROR可以返回以下两种类型消息:
    1.保存在sysmessages系统表中的用户自定义消息,在RAISERROR语句中用错误号表示。自定义错误消息是用sp_addmessage系统存储过程加到sysmessages系统表中。
    2.RAISERROR语句返回以字符串形式给出的错误信息。
    语法:
    RAISERROR({msg_id|msg_str}{,severity,state}[WITH option])

    msg_id:sysmessages系统表中用户自定义错误消息的错误号,任何用户自定义错误号都应大于50000.
    msg_str:msg_str可以是像C语言种的 printf语句一样格式化字符串。这种在RAISERROR语句中直接给出错误信息的错误号为50000
    severity:代表错误严重等级,用大于0的整数表示。0-18的错误可以被任何用户引发,19-25只能由系统管理员引发
             25以上的错误在使用RAISERROR引发时必须同时使用WITH LOG
    state:代表发生错误时的状态消息,可以是1-127之间的任意整数
    WITH option:给出RAISERROR的三个选项
            ◆LOG  :是将错误记录到SQL Sever错误日志和WINDOWS NT应用日志中
            ◆NOWAIT:立即发送消息
            ◆SETERROR:无论错误等级多少,都将@@ERROR全局变量置为用户自定义错误消息的错误号或50000.
     例1:在屏幕上显示一条信息,信息中给出当前使用的数据库的标示号和名称,信息是在语句中直接给出的,使用格式化字符串。
    DECLARE @dbid int  /*声明一个数据库标示号变量*/
    SET @dbid =DB_ID()
    DECLARE @dbname nvarchar(128)
    SET @dbname=DB_NAME()
    RAISERROR
    ('The current database ID is:%d,the database name is:%s.',16,1,@dbid,@dbname)

    返回:
    服务器: 消息 50000,级别 16,状态 1,行 5
    The current database ID is:7,the database name is:Market.

     例2:将上例种的错误信息保存到sysmessages系统表中,然后再RAISERROR 语句中用错误号调用.

    sp_messages 50005,16,'The current database ID is:%d,the database name is:%s.'
    GO
    DECLARE @dbid int
    SET @dbid =DB_ID()
    DECLARE @dbname nvarchar(128)
    SET @dbname=DB_NAME()
    RAISERROR
    (5005,16,1,@dbid,@dbname)

    返回:
    服务器: 消息 50005,级别 16,状态 1,行 5
    The current database ID is:7,the database name is:Market.

    
    
     
  • 相关阅读:
    原创【cocos2d-x】CCMenuItemToggle 在lua中的使用
    SQL Server之LEFT JOIN、RIGHT LOIN、INNER JOIN的区别
    VS的IISExpress配置通过IP访问程序
    SQLServer执行大脚本文件时,提示“无法执行脚本没有足够的内存继续执行程序 (mscorlib)”
    jqGrid中multiselect: true 操作checkbox
    display:table的几个用法(元素平分宽度,垂直居中)
    ASP.NET中 前后台方法的相互调用
    AspxGridView使用手记
    大量文本框非空判断,如何提高灵活性?
    Mysql安装、配置、优化
  • 原文地址:https://www.cnblogs.com/rohelm/p/2384385.html
Copyright © 2011-2022 走看看