我刚会写存储过程,写了一个下面的存储过程:
REATE PROCEDURE create_class
@s_name varchar(128), 
@s_lenth varchar(64),
@s_out int OUTPUT
AS
SET   XACT_ABORT   on 
BEGIN   TRANSACTION  crclass  if(select count(*) from POBJECT,PCLASSINDEX where POBJECT.IOBJECT<>0 and  POBJECT.IOBJECT = PCLASSINDEX.IOBJECT and POBJECT.SNAME = @s_name) = 0
begin
DECLARE @i_obj int update PNEWOBJECT set IOBJECT=IOBJECT+1 select @i_obj=iobject from PNEWOBJECT insert into POBJECT (IOBJECT, SNAME, ISERVER, ILOCAL,ITABLE,IREFERENCE,BSECURITY,IUSER) values(@i_obj, @s_name, 0, @i_obj, 1030,0,0,0) insert into PCLASSINDEX values(@i_obj,@s_lenth) set @s_out=1
return 1 end
else
set @s_out=0IF (@@ERROR <> 0) --这个来判断,成功:0  ;失败:非零 
ROLLBACK TRANSACTION crclassELSE
COMMIT TRANSACTION crclass
 
SET   XACT_ABORT   off 

Return @@ERROR
GO然后在查询分析器里写了入下语句
declare @ot int
exec create_class 'test','1,2,3' ,@ot OUT执行后就会报266错误我想以后在程序中调用这个存储过程,然后把回滚的操作留给存储过程中完成,这样写有什么问题吗?我数据库实在是只懂皮毛。这个问题在这里应该很简单吧。

解决方案 »

  1.   

    如果 @@TRANCOUNT 的值在存储过程完成时与过程执行时不同,则会生成一个 266 信息类错误。该错误不是由触发器中同一个条件生成的。当调用存储过程时,如果 @@TRANCOUNT 为 1 或更大,并且该过程执行 ROLLBACK TRANSACTION 或 ROLLBACK WORK 语句,则会产生 266 号错误。这是因为 ROLLBACK 回滚所有未完成的事务,并将 @@TRANCOUNT 减到 0,该值比调用过程时要小。
      

  2.   

    set @s_out=1
    return 1
    =====改成
    set @s_out=1
    begin 
    COMMIT TRANSACTION crclass
    return 1
    end
      

  3.   

    insert into PCLASSINDEX values(@i_obj,@s_lenth) set @s_out=1
    return 1 end
    else多了一个return肯定会报错的。
      

  4.   

    谢谢啦,问题找到了,就是楼上两个说得,return的问题。