游标的使用
在项目中sql脚本的编写有这么个技术点:从一个表里边取数据然后插入到另一个表中。这个操作用循环也能做,但是比较麻烦。数据库中的游标就能轻松的帮我们实现这一操作。
在数据库中,游标是一个十分重要的概念。游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条SQL 选择语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。
简单来说,游标就是一个临时存储器。SQL处理数据时,总是对整个数据集打包给你,而不会逐条给你,而游标就是将SQL打包的数据集进行二次处理,使得你能够逐条对数据修改和处理。
游标操作的几个步骤:声明游标、打开游标、读取游标数据、关闭游标、释放游标。
DECLARE contact_cursor CURSOR FOR --声明一个游标并关联数据 SELECT ProviderGUID,ProviderRecordGUID FROM ftr_ProviderRecordem(updlock) OPEN contact_cursor --打开游标 FETCH NEXT FROM contact_cursor INTO @ProviderGuid,@ProviderRecordGUID --读取游标数据 Fetch first:获取结果集第一行,Fetch next:当前位置的下一行,Fetch Prior:当前位置的上一行 --执行错误回滚 if @@error!=0 begin Rollback TransAction ftr_Providerem return end WHILE @@FETCH_STATUS = 0 --通过检测全局变量@@Fetch_Status的值,获得提取状态信息,该状态用于判断Fetch语句返回数据的有效性。当执行一条Fetch语句之后,@@Fetch_Status可能出现3种值:0,Fetch语句成功。-1:Fetch语句失败或行不在结果集中。-2:提取的行不存在。 BEGIN set @ProviderInvestigateGUID=NEWID() set @ProviderInvestigateReport2InvestigateGUID=NEWID() insert into ftr_ProviderInvestem(ApproveModel,BUGUID,ProviderGUID,ProviderRecordGUID) values(0,@BuGuid,@ProviderGuid,@ProviderRecordGUID)
FETCH NEXT FROM contact_cursor INTO @ProviderGuid,@ProviderRecordGUID --移动游标 END CLOSE contact_cursor --关闭游标 DEALLOCATE contact_cursor --删除游标