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