set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[add_equip]
(
@id int output, 
@equip_name varchar(100),
)
as 
begin
       begin transaction tran1;
INSERT INTO [equip](
equip_name 
)
VALUES(
@equip_name
);
set @id = @@identity; insert into[equipment_base](equip_id,equip_type_id) values(@id,1); commit transaction tran1;
if @@error<>0 
begin
set @id = 0;
rollback transaction tran1;
end
end
编译没问题,执行存储过程时,报错:
消息 3903,级别 16,状态 1,过程 add_equip,
ROLLBACK TRANSACTION 请求没有对应的 BEGIN TRANSACTION。
不是已经有begin tran了吗?

解决方案 »

  1.   

    if @@error=0  
    commit transaction tran1;
    else
    begin
    set @id = 0;
    rollback transaction tran1;
    end
      

  2.   

    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[add_equip]
    (
    @id int output, 
    @equip_name varchar(100),
    )
    as 
    begin
      begin transaction tran1;  --1
    INSERT INTO [equip] (equip_name ) VALUES(@equip_name);
    set @id = @@identity;insert into [equipment_base] (equip_id,equip_type_id) values(@id,1);  commit transaction tran1;  --1
    if @@error<>0 
    begin
    set @id = 0;
    rollback transaction tran1;  --2  ??? 
    end
    end
      

  3.   

    我是想如果错误的话,rollback
    现在这种情况应该怎么写呢?
      

  4.   

    改成这样了
    if @@error=0
    commit transaction tran1;
    else 
    begin
    set @id = 0;
    rollback transaction tran1;
    end
      

  5.   

    把分号去掉,语句没问题
    分号表示语句结束
      begin transaction tran1
    INSERT INTO [equip](equip_name)VALUES(@equip_name)
    set @id = @@identityinsert into[equipment_base](equip_id,equip_type_id) values(@id,1)commit transaction tran1
    if @@error<>0  
    begin
    set @id = 0;
    rollback transaction tran1
    end