2012-10-03 33 views
2

我有以下情況:一個存儲過程收集數據,並進行必要的連接,並插入結果到一個臨時表(例如:#Results)現在刪除,然後再插入到目標表中交易

,什麼我想要做的是從#Results所有記錄插入到先前創建的表,但我首先要刪除(截斷/刪除)的目標,然後插入結果。漁獲物正在清理目標表,然後在交易中插入新的#Results。

我做了以下內容:

BEGIN TRANSACTION 

DELETE FROM PracticeDB.dbo.TransTable 

IF @@ERROR <> 0 
    ROLLBACK TRANSACTION 
ELSE 
    BEGIN 

     INSERT INTO PracticeDB.dbo.TransTable 
       ( 
        [R_ID] 
        ,[LASTNAME] 
        ,[FIRSTNAME] 
        ,[DATASOURCE] 
        ,[USER_STATUS] 
        ,[Salary] 
        ,[Neet_Stat] 
       ) 
       SELECT [R_ID] 
         ,[LASTNAME] 
         ,[FIRSTNAME] 
         ,[DATASOURCE] 
         ,[USER_STATUS] 
         ,[Salary] 
         ,[Neet_Stat] 
       FROM #RESULT 

     Select @@TRANCOUNT TransactionCount, @@ERROR ErrorCount 
     IF @@ERROR <> 0 
      ROLLBACK TRANSACTION 

     ELSE 
      COMMIT TRANSACTION 

    END 

,但我知道它不能正常工作,我有一個很難找到像這樣的例子,雖然我不知道爲什麼認爲它好像共同點。在這種情況下,儘管插入失敗,它仍然會刪除目標表。

比什麼,一些指導,將作爲這一情況或最佳做法以類似的情況下(什麼最好使用等)最好的辦法不錯。預先感謝您...

回答

1

我真的沒有看到什麼錯。所以它會從你的TransTable中刪除,但是不會插入?你確定#RESULT有記錄嗎?

我看到的唯一情況是,您在Select @@TRANCOUNT TransactionCount, @@ERROR ErrorCount之後檢查@@ERROR,這意味着@@ ERROR將從您的SELECT語句而不是INSERT語句(儘管我總是希望爲0)。

有關@@ ERROR的詳細信息,請參閱:http://msdn.microsoft.com/en-us/library/ms188790.aspx

您應該檢查@@ ERROR每個語句後。

至於最佳實踐,我認爲微軟現在建議您使用的try/catch,而不是每個語句後檢查@@ ERROR的(如2005年的SQL和之後)。看看實例B在這裏:http://msdn.microsoft.com/en-us/library/ms175976.aspx

+0

謝謝你的快速反應。是的,出於某種原因,首先它會刪除目標表,但隨後會插入一個錯誤,結果將是目標表空和錯誤。似乎現在工作正常,可能是因爲你說當時#Result表爲空。在問候返回@@ ERROR值,謝謝你把那個了 –

+0

這可能是因爲'COMMIT TRANSACTION'運行。您在執行成功運行的「SELECT @@ ERROR」後檢查「@@ ERROR」。 '@@ ERROR'檢查前面的語句,在這種情況下是你的'SELECT'語句,而不是'INSERT'。明白我的意思了嗎? –

+0

是的,我遵循。再次感謝您的快速響應 –

相關問題