控制流语句---SQL Server 2005语法

 控制流语句


    Transact-SQL提供称为控制流的特殊关键字,用于控制Transact-SQL语句、语句块和存储过程的执行流。这些关键字可用于Transact-SQL语句、批处理和存储过程中。
    控制流语句就是用来控制程序执行流程的语句,使用控制流语句可以在程序中组织语句的执行流程,提高编程语言的处理能力。SQL Server提供的控制流语句如表5.9所示。

                        表5.9 控制流语句
----------------------------------------------------------------------------------
 控制流语句            说明
----------------------------------------------------------------------------------
 BEGIN…END          定义语句块

 GOTO                无条件跳转语句

 CASE                分支语句

 IF…ELSE            条件处理语句,如果条件成立,执行IF 语句;否则执行ELSE 语句

 RETURN              无条件退出语句

 WAITFOR             延迟语句

 WHILE               循环语句

 BREAK               跳出循环语句

 CONTINUE           重新开始循环语句
-------------------------------------------------------------------------------------
1. BEGIN…END 语句
    BEGIN…END语句用于将多个Transact-SQL语句组合为一个逻辑块。在执行时,该逻辑块作为一个整体被执行。
    BEGIN…END语句用于将多个Transact-SQL语句组合为一个逻辑块。在执行时,该逻辑块作为一个整体被执行。其程序代码段如下:
      BEGIN
      {
      sql_statement
      | statement_block}
      END

    其中{sql_statement|statement_block}是任何有效的Transact-SQL语句或以语句块定义的语句分组。
    任何时候当控制流语句必须执行一个包含两条或两条以上Transact-SQL语句的语句块时,都可以使用BEGIN和END语句。它们必须成对使用,任何一条语句均不能单独使用。BEGIN语句行后为Transact-SQL语句块。最后,END语句行指示语句块结束。
 
      BEGIN…END语句可以嵌套使用。例如:

      BEGIN
      DECLARE @MyVar float
      SET @MyVar = 456.256
      BEGIN
      PRINT '变量@MyVar的值为:'
      PRINT CAST(@MyVar AS varchar(12))
      END
      END

      执行结果为:

      变量@MyVar的值为:
      456.256
下面几种情况经常要用到BEGIN和END语句:

 WHILE循环需要包含语句块。
 CASE函数的元素需要包含语句块。
 IF或ELSE子句需要包含语句块。

 注 意 

上述情况下,如果只有一条语句,则不需要使用BEGIN…END语句。

 2. IF…ELSE 语句
 使用IF…ELSE语句,可以有条件地执行语句。其语法格式如下:

      IF Boolean_expression
      {sql_statement | statement_block}
      [ELSE
      {sql_statement | statement_block}]
 各参数含义如下:

  Boolean_expression  布尔表达式,可以返回TRUE或FALSE。如果布尔表达式中含有SELECT语句,必须用圆括号将SELECT语句括起来。
  {sql_statement | statement_block} Transact-SQL语句或用语句块定义的语句分组。除非使用语句块,否则IF或ELSE条件只能影响一个Transact-SQL语句的性能。若要定义语句块,可以使用控制流关键字BEGIN…END。

    IF…ELSE语句的执行方式是:如果布尔表达式的值为TRUE,则执行IF后面的语句块;否则执行ELSE后面的语句块。例如:

    USE bookdb
    IF (SELECT price FROM book WHERE book_name LIKE '%网络管理%')>50
    BEGIN
      PRINT '这本书太贵了!'
      PRINT '我承受不起!'
    END
    ELSE
    BEGIN
      PRINT '这本书还可以!'
      PRINT '我要买一本!'
    END

    执行结果为:

    这本书还可以!
    我要买一本!

             
    在IF … ELSE语句中,  IF和ELSE后面的子句都允许嵌套,嵌套层数不受限制。

        注 意 

           如果在IF …ELSE语句的IF 区和ELSE 区都使用了CREATE TABL语句或  SELECT INTO语句,那           么CREATE TABLE语句或SELECT INTO语句必须指向相同的表名。

3. CASE 语句

 使用CASE语句可以进行多个分支的选择。CASE具有两种格式:
   简单CASE格式  将某个表达式与一组简单表达式进行比较以确定结果。
   搜索CASE格式         计算一组布尔表达式以确定结果。

    简单CASE格式语法格式为:

    CASE input_expression
    WHEN when_expression THEN result_expression
     [  n ]
      …
       [
    ELSE else_result_expression
    ]
    END

 其中各参数的含义如下:

 input_expression 使用简单CASE格式时所计算的表达式,可以是任何有效的表达式。
 when_expression  用来和Input_expression做比较的表达式。Input_expression和每个when_expression 的数据类型必须相同或者是隐性转换。
 result_expression  当input_expression = when_expression的取值为TRUE时,需要返回的表达式。
 else_result_expression 当input_expression   =   when_expression的取值为FALSE时,需要返回的表 达式。

 简单CASE格式的执行方式为:当input_expression = when_expression的取值为TRUE,则返回 result_expression ;否则返回else_result_expression。如果没有ELSE子句,则返回NULL 。
 例如:

      USE pubs
      GO
      SELECT au_fname, au_lname,
         CASE state
           WHEN 'CA' THEN 'California'
           WHEN 'KS' THEN 'Kansas'
           WHEN 'TN' THEN 'Tennessee'
           WHEN 'OR' THEN 'Oregon'
           WHEN 'MI' THEN 'Michigan'
           WHEN 'IN' THEN 'Indiana'
           WHEN 'MD' THEN 'Maryland'
           WHEN 'UT' THEN 'Utah'
         END AS StateName
      FROM pubs.dbo.authors WHERE au_fname LIKE 'M%'

      执行结果如下:

      au_fname    au_lname    StateName
      -------------------------------------
      Marjorie    Green       California
      Michael     O'Leary     California
      Meander     Smith       Kansas
      Morningstar Greene      Tennessee
      Michel      DeFrance    Indiana 

 搜索CASE格式语法格式为:

      CASE
      WHEN Boolean_expression THEN result_expression
       [ n ]
       …
       [
      ELSE else_result_expression
      END

  搜索CASE格式的执行方式为:如果Boolean_expressio表达式的值为TRUE ,则返回
  THEN后面的表达式result_expression,然后跳出CASE语句;否则继续测试下一个WHEN后
  面的布尔表达式。如果所有的WHEN后面的布尔表达式均为FALSE,则返回ELSE后面的表
  达式。没有ELSE子句时,返回NULL 。
      例如:

    USE bookdb
      GO
      SELECT book_name,
      CASE
         WHEN price>=50 THEN '太贵了!'
         WHEN price>=40 THEN '还可以,考虑考虑!'
         ELSE '挺便宜的,买一本'
      END AS 价格
    FROM book
    GO

    执行结果如下:

    book_name                                     价格
    --------------------------------------------------------------
    Windows Vista看图速成                             挺便宜的,买一本
    3D Studio MAX实例精选                             挺便宜的,买一本
    Windows 2003 Server网络管理                       还可以,考虑考虑!
    Mathematica 5.0入门与提高                          挺便宜的,买一本

4. WHILE 语句

    WHILE语句可以设置重复执行SQL语句或语句块的条件。只要指定的条件为真,就重复执行语句。可以使用BREAK和CONTINUE关键字在循环内部控制WHILE循环中语句的执行。
    其语法格式如下:

    WHILE Boolean_expression
    { sql_statement | statement_block }
    [ BREAK ]
    { sql_statement | statement_block }
    [ CONTINUE ]

    各参数含义如下:

     Boolean_expression  返回TRUE或FALSE 的布尔表达式。如果布尔表达式中含有SELECT语句,必须用     圆括号将SELECT语句括起来。
     {sql_statement | statement_block} Transact-SQL语句或用语句块定义的语句分组。
     若要定义语句块,可以使用BEGIN…END语句。
     BREAK导致从最内层的WHILE循环中退出。将执行出现在END关键字后面的任何语句,END关键字为循环     结束标记。
     CONTINUE使WHILE循环重新开始执行,忽略CONTINUE关键字后的任何语句。

    WHILE语句的执行方式为:如果布尔表达式的值为TRUE,则反复执行WHILE语句后面的语句块;否则将     跳过后面的语句块。
    例如,下面的SQL语句是计算从1加到100的值:

    DECLARE @MyResult int,@MyVar int
    SET @MyVar = 0
    SET @MyResult = 0
    WHILE @MyVar<=100
    BEGIN
        SET @MyResult = @MyResult+@MyVar
        SET @MyVar=@MyVar+1
    END
    PRINT CAST(@MyResult AS char(25))

    执行结果为:
    5050
5. GOTO 语句
   GOTO语句可以实现无条件的跳转。其语法格式为:

      GOTO  lable

    其中lable为要跳转到的语句标号。其名称要符合标识符的规定。
    GOTO语句的执行方式为:遇到GOTO语句后,直接跳转到lable标号处继续执行,而GOTO后面的语句将不    被执行。
    例如,使用下面的语句重新计算从1加到100的值:

      DECLARE @MyResult int,@MyVar int
      SET @MyVar = 0
      SET @MyResult = 0
      my_loop:          --定义标号
        SET @MyResult = @MyResult+@MyVar
        SET @MyVar=@MyVar+1
      IF @MyVar<=100
      GOTO my_loop       --如果小于100,跳转到my_loop标号处
      PRINT CAST(@MyResult AS char(25))

      执行结果与上面相同。

6. RETURN 语句

  使用RETURN语句,可以从查询或过程中无条件退出。可在任何时候用于从过程、批处理或语句块中退出,而不执行位于RETURN之后的语句。
      语法格式为:

      RETURN [ integer_expression ]

      其中integer_expression为一整数数值,是RETURN语句要返回的值。

  注 意 

  当用于存储过程时,RETURN不能返回空值。如果试图返回空值,将生成警告信息并返回0值。

  例如,首先执行下面的SQL语句创建一个存储过程:

      USE bookdb
      GO
      CREATE PROC MyPro @bookname char(50)  --创建存储过程MyPro
      AS
    IF (SELECT price FROM book WHERE book_name LIKE @bookname)>=50
       RETURN 1
    ELSE
       RETURN 2

    然后执行下面的SQL语句:

    DECLARE @Return_value int
    EXEC @Return_value=MyPro '%网络管理%'
    IF @Return_value=1
      PRINT '这本书太贵了!'
    ELSE
      PRINT '这本书还可以,值得考虑购买!'
    GO

    执行结果如下:

    这本书还可以,值得考虑购买!

7. WAITFOR 语句

    使用WAITFOR语句,可以在指定的时间或者过了一定时间后,执行语句块、存储过程或者事务。
    其语法格式为: 

    WAITFOR { DELAY 'time' | TIME 'time' }

     DELAY      指示SQL Server一直等到指定的时间过去,最长可达24h。
     'time'  要等待的时间。可以按datetime数据可接受的格式指定time,也可以用局部
       变量指定此参数。不能指定日期,因此在datetime值中不允许有日期部分。
     TIME     指示SQL Server等待到指定时间。 

    例如,下面的SQL语句指定在1:58:00时执行一个语句: 

    BEGIN
     WAITFOR  TIME '1:58:00'
     PRINT '现在是1:58:00'
    END

    执行后,等计算机上的时间到了1:58:00时,出现下面结果: 

    现在是1:58:00

 

参考:《新概念SQL+Server+2005教程》

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Selena

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值