加载中…
个人资料
SQLServerGuru
SQLServerGuru
  • 博客等级:
  • 博客积分:0
  • 博客访问:22,826
  • 关注人气:17
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
正文 字体大小:

SQL Server 流控制语句

(2011-04-14 21:40:12)
标签:

sql

server

流控制语句

it

分类: T-SQL编程

流控制语句

 

 

IF

 

if语句用于条件的测试。当if语句取值为true时,执行if语句后的语句或语句块。若if语句取值为false,则跳过if语句后的语句或语句块。

如果if语句后需执行的语句超过一条,需要包含在begin...end之中。

 

if datepart(dw,getdate())+@@datefirst%7=6 begin

   print 'Today is Friday.'

end

 

IF…ELSE

 

if语句取值为true时,执行if语句后的语句或语句块。然后跳过else的语句块执行之后的语句。若if语句取值为false,则跳过if语句后的语句或语句块,执行else后的语句块。

 

if datepart(dw,getdate())+@@datefirst%7=6 begin

   print 'Today is Friday.'

end else begin

   print 'Today is NOT Friday!'

end

 

WHILE

 

只要指定的条件为truewhile语句就会重复语句或语句块。

 

declare @today datetime

set @today=getdate()

print 'These days are Black Fridays:'

while (year(@today)<=2013) begin

   if datepart(dw,@today)+@@datefirst%7=6

      and datepart(d,@today)=13 begin

      print convert(char(10),@today,112)

   end

   set @today=dateadd(d,1,@today)

end

 

BREAKCONTINUE

 

    breakcontinue通常与while一起使用。break退出最内层的while语句,continue则忽略之后的语句重新开始while循环。

 

set nocount on

use tempdb

if object_id('Table_A','U') is not null begin

   drop table Table_A

end

if object_id('Table_B','U') is not null begin

   drop table Table_B

end

Go

create table Table_A(idx int identity,order_id int)

create table Table_B(idx int identity,order_id int)

insert Table_A(order_id) select 20080808

insert Table_A(order_id) select 20080809

insert Table_A(order_id) select 20080810

insert Table_A(order_id) select 20080811

insert Table_A(order_id) select 20080812

insert Table_A(order_id) select 20080813

insert Table_A(order_id) select 20080814

insert Table_B(order_id) select 20080809

insert Table_B(order_id) select 20080812

insert Table_B(order_id) select 20080813

select * from Table_A

select * from Table_B

 

declare @err_cnt     int

       ,@i           int

       ,@j           int

       ,@max_err_cnt int

       ,@order_id    int

set @err_cnt=0

set @max_err_cnt=2

select @i=1,@j=max(idx) from Table_A

while @i<=@j begin

   select @order_id=order_id from Table_A where idx=@i

   if exists(select * from Table_B where order_id=@order_id) begin

      set @err_cnt=@err_cnt+1

      if @err_cnt<=@max_err_cnt begin

         print 'order_id : '+convert(varchar,@order_id)

              +' already exists. skip '+convert(varchar,@err_cnt)

              +' time(s).'

         set @i=@i+1

         continue

      end else begin

         print 'exceeding maximum error count, batch terminated.'

         break

      end

   end

   delete Table_A

      output deleted.order_id

      into Table_B(order_id)

      where idx=@i

   set @i=@i+1

end

select * from Table_A

select * from Table_B

 

GOTO

 

用于将执行流更改到标签处,即跳过goto之后的T-SQL语句,从标签处继续执行。标签可以出现在goto语句之前或之后。标签由标识符加冒号构成。

这个例子中,要求把14人的球队分成2组,且两个组的平均实力指数差不超过2

 

set nocount on

use tempdb

if object_id('Member','U') is not null begin

   drop table Member

end

Go

create table Member(member_id int identity

                   ,name nvarchar(50),ability int)

insert Member(name,ability) select 'Tom Sawyer',91

insert Member(name,ability) select 'Per Gessle',87

insert Member(name,ability) select 'James Blunt',85

insert Member(name,ability) select 'David Jones',93

insert Member(name,ability) select 'Darren Hayes',88

insert Member(name,ability) select 'Benny Andersson',84

insert Member(name,ability) select 'Björn Ulvaeus',76

insert Member(name,ability) select 'Keanu Reeves',89

insert Member(name,ability) select 'David Beckham',82

insert Member(name,ability) select 'Nakata Hidetoshi',78

insert Member(name,ability) select '',73

insert Member(name,ability) select '',90

insert Member(name,ability) select '',86

insert Member(name,ability) select '',89

Go

declare @member table(group_id int,member_id int

                     ,name nvarchar(50),ability int)

declare @ability_1 int

       ,@ability_2 int

re_grouping:

delete @member

insert @member select 0,member_id,name,ability from Member

while exists(select group_id from @member where group_id=0) begin

   update @member set group_id=1 where member_id=(

      select top 1 member_id from @member where group_id=0

      order by ability/10 desc,newid())

   update @member set group_id=2 where member_id=(

      select top 1 member_id from @member where group_id=0

      order by ability/10 desc,newid())

end

select @ability_1=avg(ability) from @member where group_id=1

select @ability_2=avg(ability) from @member where group_id=2

if abs(@ability_1-@ability_2)>=2 begin

   print convert(varchar,@ability_1)+':'+convert(varchar,@ability_2)

   goto re_grouping

end

;with CTE_group(group_id,avg_ability) as(

select group_id,avg(ability) from @member group by group_id

)select m.*,g.avg_ability from @member as m

    join CTE_group as g on m.group_id=g.group_id

    order by m.group_id,m.ability desc

 

WAITFOR

 

waitfor delay 'time_to_pass'在等待指定的时间间隔之后,再执行之后的语句;

waitfor time 'time_to_execute'在指定的时刻到达时,再执行之后的语句。

 

可以使用datetime数据可接受的格式之一指定time_to_passtime_to_execute,也可以将其指定为局部变量,但不能指定日期。因此,不允许指定 datetime值的日期部分。

 

RETURN

 

无条件退出当前的存储过程或批处理,之后的语句不再执行。

 

 

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有