CREATE PROCEDURE [dbo].[UP_Products_AddJewelry]
@ProductId int output,
@Category1 int,
@Category2 int,
@Category3 int,
@ProductSN varchar(80),
@ProductName varchar(100),
@PurchasePrice decimal(18,0),
@MarketPrice decimal(19,2),
@PreferentialPrice decimal(19,2),
@VipPrice decimal(18,2),
@Pic1 varchar(100),
@Pic2 varchar(100),
@Pic3 varchar(50),
@Pic4 varchar(100),@LongDescription ntext,
@Stocks int,
@Commend bit,
@Hot bit,
@HotSales bit,
@Agio bit,
@LowPrice bit,
@Hidden bit,
@Hit int,
@Sort int,
@AddDate smalldatetime,
@LastUpdatedDate smalldatetime,
@RelationshipProducts varchar(1000),
@FileUrl varchar(50),
@TempletId int,@Pattern nvarchar(50),
@Texture nvarchar(50),
@Brand nvarchar(50),
@Style nvarchar(50),
@Shape nvarchar(50),
@Inlay nvarchar(50) AS 
 BEGIN TRY    BEGIN TRAN --开始事务
    
INSERT INTO Products(
[Category1],[Category2],[Category3],[ProductSN],[ProductName],[PurchasePrice],[MarketPrice],[PreferentialPrice],[VipPrice],[Pic1],[Pic2],[Pic3],[Pic4],[LongDescription],[Stocks],[Commend],[Hot],[HotSales],[Agio],[LowPrice],[Hidden],[Hit],[Sort],[AddDate],[LastUpdatedDate],[RelationshipProducts],[FileUrl],[TempletId]
)VALUES(
@Category1,@Category2,@Category3,@ProductSN,@ProductName,@PurchasePrice,@MarketPrice,@PreferentialPrice,@VipPrice,@Pic1,@Pic2,@Pic3,@Pic4,@LongDescription,@Stocks,@Commend,@Hot,@HotSales,@Agio,@LowPrice,@Hidden,@Hit,@Sort,@AddDate,@LastUpdatedDate,@RelationshipProducts,@FileUrl,@TempletId
)
SET @ProductId = @@IDENTITY

INSERT INTO Products_Property([ProductId],[Pattern],[Texture],[Brand],[Style],[Shape],[Inlay])VALUES(@ProductId,@Pattern,@Texture,@Brand,@Style,@Shape,@Inlay)    COMMIT TRAN;
    Return @ProductId ---返回ProductIdEND TRY
BEGIN CATCH
         ROLLBACK TRANSACTION
         Return -1
END CATCH;
---------------------------
正确没有问题,如果将Products_Property表名改一下(为了演示错误)则提示:在 EXECUTE后的事务计数指示缺少了COMMIT和ROLLBACK TRANSACTION 语句。上一计数=1,当前计数=0。
请教这是什么错误?

解决方案 »

  1.   

    begin catch
    if @@trancount>1
    rollback tran
    end catch
      

  2.   

    BEGIN CATCH
      if @@trancount >0 
            ROLLBACK TRANSACTION 
            Return -1 
    END CATCH; 
    会不会自动回滚了?
      

  3.   

    把return 去掉吧,可以回滚,我去查了一下,说你的只是个错误提示,不影响回滚什么的
      

  4.   

    感觉可能是因为return后退出了过程??最后没有把@@trancount值改变引起的@@值不对应吧
    我再找找帮助哦
      

  5.   

    这种结构并不能将错误传递到catch.
      

  6.   


    在开始加这句看看还报错不
    AS
    set xact_abort on
    BEGIN TRY    BEGIN TRAN --开始事务 
      

  7.   

    TRY...CATCH 构造捕捉所有严重级别大于 10 但不终止数据库连接的错误。
    你的表找不到,属于数据库连接错误.
      

  8.   

    因此,会出现你所说的  在 EXECUTE后的事务计数指示缺少了COMMIT和ROLLBACK TRANSACTION   的错误.
      

  9.   

    如果你把catch块改成:
    begin catch
    SELECT ERROR_LINE() AS ErrorLine;
    --rollback transaction
    --return -1
    end catch;你就能知道并未进入catch块了.
      

  10.   

    try...catch结构是我看书加上的,有其它的写法吗?
      

  11.   

    就这个帖子再问一下 http://topic.csdn.net/u/20090104/18/0174b2c8-3868-4fc7-8a5a-b133e6f6092b.html
      

  12.   

    另外过去是这样写法,也提示同样错误。.......
     AS 
        BEGIN TRAN --开始事务
        
    INSERT INTO Products(
    [Category1],[Category2],[Category3],[ProductSN],[ProductName],[PurchasePrice],[MarketPrice],[PreferentialPrice],[VipPrice],[Pic1],[Pic2],[Pic3],[Pic4],[LongDescription],[Stocks],[Commend],[Hot],[HotSales],[Agio],[LowPrice],[Hidden],[Hit],[Sort],[AddDate],[LastUpdatedDate],[RelationshipProducts],[FileUrl],[TempletId]
    )VALUES(
    @Category1,@Category2,@Category3,@ProductSN,@ProductName,@PurchasePrice,@MarketPrice,@PreferentialPrice,@VipPrice,@Pic1,@Pic2,@Pic3,@Pic4,@LongDescription,@Stocks,@Commend,@Hot,@HotSales,@Agio,@LowPrice,@Hidden,@Hit,@Sort,@AddDate,@LastUpdatedDate,@RelationshipProducts,@FileUrl,@TempletId
    )
    SET @ProductId = @@IDENTITY

    INSERT INTO Products_ExProperty([ProductId],[Pattern],[Texture],[Brand],[Style],[Shape],[Inlay])VALUES(@ProductId,@Pattern,@Texture,@Brand,@Style,@Shape,@Inlay)
        If @@Error <> 0
          Begin
             RollBack Tran
             Return -1
          End
        Else
          Begin
             Commit Tran
             Return @ProductId ---返回ProductId
          End    
    GO
      

  13.   

    测试了下,设置xact_abort,回滚是没问题的那种低级别错误,帮助上讲可以单写过程,然后再另一个过程里用try catch,可以捕获,其他方法未知
      

  14.   

    楼主的xact_abort都没设置,这样连回滚都回滚不了
      

  15.   

    这种错误似乎都不能被捕获后直接处理.
    建议使用 if exists(... 检查表是否存在,再执行插入表或回滚操作.
      

  16.   

    好的,两位高手帮我看看如何在sqlserver2005中   调试存储过程 ?
    http://topic.csdn.net/u/20090104/18/0174b2c8-3868-4fc7-8a5a-b133e6f6092b.html