SQL过程中的超时

vik*_*sde 0 sql t-sql stored-procedures

我使用下面的SQL从Intranet中的文件导入一些数据.然而,每隔一段时间,就会出现超时错误并且proc会失败,这就是我使用事务的原因.如果事务失败,我希望清除ImportedTable.然而,这似乎并没有发生.这里有什么我想念的吗?

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
Run Code Online (Sandbox Code Playgroud)

更新1:我正在针对SQL 2000和SQL2005运行此操作.

更新2:澄清:ImportedTable永远不会在Exit1清除.

Rem*_*anu 6

SET XACT_ABORT ON将发生任何错误以回滚事务,无需在出现错误时显式回滚.您还应该考虑使用BEGIN TRY/BEGIN CATCH,因为编程比在每个语句后检查@@ ERROR要容易得多.