2009-12-30 41 views
0

我正在使用下面的sql從Intranet中的文件導入一些數據。然而每過一段時間,都會出現超時錯誤,並且proc會失敗,這就是我使用事務的原因。如果事務失敗,我想讓ImportedTable清除。但是,這似乎並沒有發生。有什麼我在這裏失蹤?在SQL過程中超時

ALTER PROCEDURE [dbo].[pr_ImportData] 
@StoreCode varchar(10), 
@UserId varchar(100) 
AS 

BEGIN TRANSACTION 

-- 1) Clear the data 
exec pr_INTRANET_ClearData @StoreCode, @UserId 

IF @@ERROR <> 0 
BEGIN 
ROLLBACK TRANSACTION 
GOTO EXIT1 
END 

-- 2) Add the new data to the history Table 
INSERT INTO data_History (...) 
SELECT ... from ImportedTable WHERE StoreCode = @StoreCode and UserId = @UserId 

IF @@ERROR <> 0 
BEGIN 
ROLLBACK TRANSACTION 
GOTO EXIT1 
END 

-- 3) Add the data to the live table 
INSERT INTO data_Live (...) 
SELECT ... from ImportedTable WHERE StoreCode = @StoreCode and UserId = @UserId 

IF @@ERROR <> 0 
BEGIN 
ROLLBACK TRANSACTION 
GOTO EXIT1 
END 

IF @@ERROR <> 0 
BEGIN 
ROLLBACK TRANSACTION 
GOTO EXIT1 
END 

EXIT1: 
-- 4) Delete the rows from the temp table 
DELETE FROM ImportedTable WHERE StoreCode = @StoreCode and UserId = @UserId 

COMMIT TRANSACTION 

更新1:我對SQL 2000和SQL2005運行此。

更新2:澄清:ImportedTable從不會在Exit1清除。

+0

pr_INTRANET_ClearData是否返回錯誤代碼?我不認爲@@ Error可以用這樣的調用工作。嘗試聲明@Error,然後設置exec @Error = pr_INTRANET_ClearData @StoreCode,@UserId。確保pr_INTRANET_ClearData返回過程中的@@錯誤或自定義錯誤代碼。它可能會掛掉這個程序所做的任何事情。 – 2009-12-30 16:27:34

回答

6

SET XACT_ABORT ON會使回滾事務發生任何錯誤,消除在發生錯誤時顯式回滾的需要。您還應該考慮使用BEGIN TRY/BEGIN CATCH,因爲比在每個語句後檢查@@ ERROR更容易編程。

+0

會在SQL2000和SQL2005中工作嗎? – vikasde 2009-12-30 16:31:08

+0

SET XACT_ABORT將在兩個工作。 Try/Catch僅適用於SQL2005及更高版本。 – MartW 2009-12-30 16:36:15

+0

真棒小費。謝謝! – vikasde 2009-12-30 16:38:50