但是现在还报错误:COMMIT TRANSACTION 请求没有对应的 BEGIN TRANSACTION。这是怎么回事呢?
这个问题第1个回答:
贴出你的语句. 对提交和回滚要作判断,看执行哪一个.我怀疑你没有这一点.把提交执行完了.后来又执行了回滚,导至你上面的错误. 这个问题第2个回答:
我的存储过程如下:
SQL code
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
-- 区划表迁移存储过程
ALTER procedure temp_pd_districts
as
declare @districtID varchar(6)
declare @districtNS varchar(8)
declare @districtNL varchar(16)
declare @parentID nvarchar(50)
declare @status int
declare @postUserId int
declare @updateUserId int
declare @parentLevel int --上级区划的层次
declare @parentIdTemp int --上级区划id的临时变量
--declare @newSysareaIdTemp int --新库区划表id临时变量
declare @errorMsg varchar(200) --插入错误显示变量
begin
-- 插入最大的区划记录‘上海市’
truncate table TEMP_SYS_AREA
insert into sqmis.dbo.TEMP_SYS_AREA(pid,area_name,short_name,level_id,code,status,post_user_id,post_time,update_user_id,update_time)
values(1,'上海市','本市',1,null,1,0,getDate(),0,getDate());
if @@error<>0
begin
-- 插入失败,回滚
rollback TRANSACTION
select top 1 @errorMsg = description from sqmis.dbo.sysmessages where error = @@error
insert into sqmis.dbo.temp_exp(pname,tname,tid_value,err,status,hadle)
values('temp_pd_districts','districts','','1:'+@errorMsg,-1,null);
return;
end
else
begin
begin
commit transaction
end
-- 从旧库的districts表里取得区划记录
declare districts cursor for
select sq.DistrictID, sq.DistrictNameShort,sq.DistrictNameLong,sq.ParentID
from shsqqy.dbo.districts sq
where isnull(sq.DistrictID,'')<>''
order by sq.DistrictID asc;
open districts
fetch next from districts into @districtID,@districtNS,@districtNL,@parentID
while (@@FETCH_STATUS<>-1)
begin
-- 获取父id
print @parentID;
set @parentIdTemp=0;
select @parentIdTemp=sa.id,@parentLevel=sa.level_id
from sqmis.dbo.TEMP_SYS_AREA sa
where sa.code is null or sa.code=@parentID;
print @parentIdTemp;
-- 验证父id是否存在
if @parentIdTemp>0
begin
print 'start ------------------------------------------------'
insert into sqmis.dbo.TEMP_SYS_AREA(pid,area_name,short_name,level_id,code,status,post_user_id,post_time,update_user_id,update_time)
values(@parentIdTemp,@districtNL,@districtNS,(@parentLevel+1),@districtID,1,0,getDate(),0,getDate())
end
print 'ing ------------------------------------------------'
if @@error<>0
begin
-- 插入失败,回滚
rollback
select top 1 @errorMsg = description from sqmis.dbo.sysmessages where error = @@error
insert into sqmis.dbo.temp_exp(pname,tname,tid_value,err,status,hadle)
values('temp_pd_districts','districts',@districtID,'2:'+@errorMsg,-1,null)
return
end
else
begin
commit transaction
end
print 'end ------------------------------------------------'
fetch next from districts into @districtID,@districtNS,@districtNL,@parentID
end
close districts
deallocate districts
end
end
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
帮我看下,谢谢了!分不够,我有分了再加吧! 这个问题第3个回答:
ALTER procedure temp_pd_districts as declare @districtID varchar(6) declare @districtNS varchar(8) declare @districtNL varchar(16) declare @parentID nvarchar(50) declare @status int declare @postUserId int declare @updateUserId int declare @parentLevel int --上级区划的层次 declare @parentIdTemp int --上级区划id的临时变量 --declare @newSysareaIdTemp int --新库区划表id临时变量 declare @errorMsg varchar(200) --插入错误显示变量 begin -- 插入最大的区划记录‘上海市’ truncate table TEMP_SYS_AREA begin tran insert into sqmis.dbo.TEMP_SYS_AREA(pid,area_name,short_name,level_id,code,status,post_user_id,post_time,update_user_id,update_time) values(1,'上海市','本市',1,null,1,0,getDate(),0,getDate());
if @@error <>0 begin -- 插入失败,回滚
rollback TRANSACTION select top 1 @errorMsg = description from sqmis.dbo.sysmessages where error = @@error insert into sqmis.dbo.temp_exp(pname,tname,tid_value,err,status,hadle) values('temp_pd_districts','districts','','1:'+@errorMsg,-1,null); return; end else begin begin commit transaction end -- 从旧库的dist