2015-08-28 43 views
2

是否有可能基于XACT_STATE插入数据到表中。例如:如果错误,然后插入

IF(XACT_STATE() = 1) 
     BEGIN 
      INSERT INTO TABLE1 VALUES() 
      COMMIT TRANSACTION 
     END 
    ELSE 
    IF(XACT_STATE() = -1) 
     BEGIN 
      INSERT INTO TABLE2 VALUES() 
      ROLLBACK TRANSACTION 
     END 

    SELECT ERROR_NUMBER() AS ERRORNUMBER, 
      ERROR_SEVERITY() AS ERRORSEVERITY, 
      ERROR_STATE() AS ERRORSTATE, 
      ERROR_PROCEDURE() AS ERRORPROCEDURE, 
      ERROR_LINE() AS ERRORLINE, 
      ERROR_MESSAGE() AS ERRORMESSAGE1 

如果这是不可能的,是否有其他选择?

+3

@NathanOliver,用户没有大喊大叫。所有大写都是有效的SQL语法。 – Andy

+0

如果事务被分类为不可接受的,那么在您的示例中,您不能执行像INSERT INTO TABLE2这样的写入操作,只能执行读取操作和回滚。 –

+0

@在标题中,这是非常**可争议的。因为他*可以*使用小写字母。事实上,所有上限的表面效应具有更大的权重,因为替代方案也是正确的。 – Deduplicator

回答

1

是的,你可以做你正在做的事情(如果第一次插入失败,插入到替代表中)。但是我会用TRY..CATCH块来做这件事,,,类似.......

BEGIN TRY 
     BEGIN TRANSACTION 
      INSERT INTO TABLE1 VALUES() 
     COMMIT TRANSACTION 
END TRY 
BEGIN CATCH 
    IF @@TRANCOUNT > 0 
    BEGIN 
     ROLLBACK TRANSACTION 
    END 

      INSERT INTO TABLE2 VALUES() 
      ROLLBACK TRANSACTION 

    SELECT ERROR_NUMBER() AS ERRORNUMBER, 
      ERROR_SEVERITY() AS ERRORSEVERITY, 
      ERROR_STATE()  AS ERRORSTATE, 
      ERROR_PROCEDURE() AS ERRORPROCEDURE, 
      ERROR_LINE()  AS ERRORLINE, 
      ERROR_MESSAGE() AS ERRORMESSAGE1 

END CATCH 
+0

我唯一要做的就是将ROLLBACK TRANSACTION移动到INSERT INTO table2 VALUES之前 – AznDevil92