2015-08-28 42 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