FETCH NEXT FROM Cur INTO @DANo,@UpdateTime,@LogTime,@DataType,@DAType,@DAYear,@DAMonth,@DADay,@DAHour,@CollegeNo,@CampusNo,@BuildingNo,@BuildingType,@SumQty,@EType,@EIndex,
@ESubitem,@ESubitem1,@ESubitem2,@Unit,@Lable,@Note
WHILE @@fetch_status=0
BEGIN
--print @BuildingType
--开始事务
BEGIN TRANSACTION
SAVE TRANSACTION sp_Campus_TRANS
--提交事务
LABCOMMIT:
IF (@@error = 0)
BEGIN
COMMIT TRANSACTION
SET @Output=0
RETURN(0)
END
--以下回滚事务
LABROLLBACK:
BEGIN
--插入报警信息
set @WarningMessage='学校数据:'+@CollegeNo+',编号:'+@DANo+',事务提交失败'
insert into T_WarningMessage (DANo,DATime,CollegeNo,WarningType,Info) values (@DANo,@UpdateTime,@CollegeNo,'',@WarningMessage)
ROLLBACK TRANSACTION sp_Campus_TRANS
commit transaction
SET @Output=-1
RETURN @@error
END
[color=#008000]问题:
这里用了一个游标循环取出来的数据,在循环中使用了一个事务。 发现事务处理完第一条数据,提交后,循环就终止了。 永远只会处理一条数据。 Why??? 为什么会这样???
[/color]
--填充游标变量
FETCH NEXT FROM Cur INTO @DANo,@UpdateTime,@LogTime,@DataType,@DAType,@DAYear,@DAMonth,@DADay,@DAHour,@CollegeNo,@CampusNo,@BuildingNo,@BuildingType,@SumQty,@EType,@EIndex,
@ESubitem,@ESubitem1,@ESubitem2,@Unit,@Lable,@Note
------解决思路----------------------
没有这规定
楼主报什么错啊?贴出来看一下
------解决思路----------------------
应该是写法的问题
------解决思路----------------------
你的 while 内部,还应该有一个 FETCH NEXT FROM Cur INTO
大概如下
FETCH NEXT FROM Cur INTO
while @@fetch_status = 0
begin
-- to do
FETCH NEXT FROM Cur INTO -- 这个不能丢了,不然就是永远第一个值 。
end -- end while
------解决思路----------------------
建议事务放到游标外面。
万一游标出错呢?怎么办
------解决思路----------------------
能用,要善用事务
要用goto 配合循环
循环到出错数据时,是退出还是继续执行
------解决思路----------------------
RETURN--去掉
在游标里用了没有循环,用goto跳过
------解决思路----------------------
WHILE @@fetch_status=0
BEGIN
--print @BuildingType
--开始事务
BEGIN TRANSACTION
SAVE TRANSACTION sp_Campus_TRANS
--提交事务
LABCOMMIT:
IF (@@error = 0)
BEGIN
COMMIT TRANSACTION
SET @Output=0
GOTO success
END
--以下回滚事务
LABROLLBACK:
BEGIN
--插入报警信息
set @WarningMessage='学校数据:'+@CollegeNo+',编号:'+@DANo+',事务提交失败'
insert into T_WarningMessage (DANo,DATime,CollegeNo,WarningType,Info) values (@DANo,@UpdateTime,@CollegeNo,'',@WarningMessage)
ROLLBACK TRANSACTION sp_Campus_TRANS
success:
commit TRANSACTION
SET @Output=-1
END
------解决思路----------------------
看你自己要什么效果,最外层有事务时才需要保存事务点,提交第2层事务再提交最外层事务,用save时首先要知道最外层有没有事务
------解决思路----------------------
IF @@TRANCOUNT>0 加判断
WHILE @@fetch_status=0
BEGIN
--print @BuildingType
--开始事务
BEGIN TRANSACTION
SAVE TRANSACTION sp_Campus_TRANS
--提交事务
LABCOMMIT:
IF (@@error = 0)
BEGIN
COMMIT TRANSACTION
SET @Output=0
GOTO success
END
--以下回滚事务
LABROLLBACK:
BEGIN
--插入报警信息
set @WarningMessage='学校数据:'+@CollegeNo+',编号:'+@DANo+',事务提交失败'
insert into T_WarningMessage (DANo,DATime,CollegeNo,WarningType,Info) values (@DANo,@UpdateTime,@CollegeNo,'',@WarningMessage)
ROLLBACK TRANSACTION sp_Campus_TRANS
success:
IF @@TRANCOUNT>0
commit TRANSACTION
SET @Output=-1
END
------解决思路----------------------
效率在于语句而不在于事务,事务影响可以忽略不计。
写在外面,出错时回滚所有操作,写在里面只回滚出错操作。