接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 游标的正确用法
最好不要使用游标。