Transact-SQL2

接1:

 3.4.2 表变量
 表变量类似于临时表的对象。
 表变量的限制:
  --只能是select、update、delete、insert和declare cursor语句的一部分。
  --表变量可以用在Select语句,不能作为select....into语句中的目的地。
   select lookupId lookup into @tablevariable from lookup ;----wrong
  --表变量可以用在insert语句,除了当insert语句从存储过程中收集值时。
   inset into @tablevariable exec poMyProcedure;----wrong
  --与临时表不同,表变量总有一个临时作用域。它们可以只用于声明它们的批处理、存储过程和函数中。
  --表变量被认为是非持久对象,因此在执行Rollback Transaction语句后它们不会被回滚。


3.5 流程控制语句
 3.5.1 注释
  1、单行注释:--
  2、多行注释:/*...*/
  3、文档化代码
 3.5.2 语句块:begin...end
  begin
   Transact-SQL statements;
  end
  类似C#中的{...}
 3.5.3 条件执行:if语句
  if boolean_expression
   Transact-SQL_statement | statement_block
  else
   Transact-SQL_statement | statement_block
 3.5.4 循环:while语句
  While Boolean_expression
   sql_statement | statement_block
   break
   sql_statement | statement_block
   continue
 3.5.5 无条件执行:GoTo语句
  GoTo label
  ......
  label:
   label必须在同一个存储过程或批处理内。
 3.5.6 调度执行:WaitFor语句,允许开发人员指定何时或什么时间间隔后执行余下的T-SQL语句。
  在SQL Server中,有两种方式调度批处理或存储过程执行的方式。
  一种是SQL Server Agent,另一种是WaitFor语句。
  WaitFor {Delay 'time'| Time 'time'}
   一种变体是用于指定继续执行前必须经过的延时(时间间隔必须小于24小时)
   WaitFor Delay '00:01:00'
    select * from Equipment
   另一种变体允许开发人员指定一个具体时间,指明何时继续执行。
   下例指定晚上11:00之前执行完全数据库备份。
   WaitFor Time '23:00'
    Backup Database Asset to Asset_bkp
  用这种语句有一个问题,当服务器等待执行语句时,连接仍然是堵塞的。因此用SQL Server Agent 比用WaitFor语句调度作业要好的多。
 

3.6 游标

 这个存储过程先声明一个游标:declare @crsrvar Cursor
 然后这个游标会与特定资产的属性集合关联:
  set @crsrvar = Cursor for
    select Property,Value,Unit
    from dbo.InventoryProperty InventoryProperty
     inner join dbo.Property Property
     on InventoryProperty.PropertyId = Property.PropertyId
     where InventoryProper.InventoryId = @intInventoryId
 在游标可以使用之前,需要打开:
  Open @crsrvar
 然后将第一个记录的内容取出到局部变量中:
  Fech Next From @crsrvar
  into @chvProperty,@chvValue,@chvUnit
  
 如果成功取出,就可以开始一个处理整个记录集的循环:
  while(@@FETCH_STATUS = 0)
 处理了第一个记录中的值后,读取下一个记录:
  Fetch Next from @crsrvar
  into @chvProperty,@chvValue,@chvUnit
 一旦所有的记录都已经读取,@@fetch_status的值会被设置为-1,然后退出循环。这是需要关闭并释放游标,从而完成存储过程:
  Close @crsrvar
  Deallocate @crsrvar

 3.6.2 与游标相关的语句和函数
  1、Declare Cursor语句
   声明T-SQL游标,并指定它的行为和构成该行为的查询。
   declare cursor_name Cursor
   for select_statement
  2、Open语句
   Open语句执行Declare Cursor语句中指定的Select语句并填充游标。
  3、Fetch语句
   读取T-SQL游标中指定的行:这个语句可以迫使游标位于当前记录的下一条(Next)、前一条(Prior)、第一条(First)、最后一条(Last)记录上。还可以指定记录的绝对(Absolute)位置,或相对于当前记录的相对(Relative)位置。
   如果游标刚刚打开,可以用Fetch Next来读取第一个记录。
  4、@@fetch_status
   它在当前连接过程中返回上一次执行Fetch语句时的成功代码。通常作为退出循环的条件。
   0:取出完全成功;
   -1:Fetch语句试图读取记录集(上次已经读过的记录)以外的记录,或者Fetch语句失败;
   -2:记录丢失(例如,其间别人删除了这条记录)。
  5、@@cursor_rows
   一旦打开游标,它被设置为游标中的记录数。
   当游标是动态的或是keyset类型,@@cursor_rows函数会被设置为负数,表示它被异步填充。
  6、Close语句
   关闭打开的游标,释放当前记录集,并释放游标所持有的行上的锁。
   必须在打开的游标上执行,如果游标刚刚被声明,则SQL Server会报错。
  7、Deallocate语句
   执行Close语句后,游标的结构仍然存在。这时可以再次打开它,如果不打算再使用它来,就应该用Deallocate语句删除这个结构。
   
 3.6.3 使用游标的问题
  有价值但是危险。
   首先,游标是过程化的。
   性能损失时更大的问题。
 3.6.4 游标的正确用法
  最好不要使用游标。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值