2009-12-30 6 views
0

아래의 sql을 사용하여 인트라넷에서 파일의 일부 데이터를 가져옵니다. 그러나 때때로, 시간 초과 오류가 발생하고 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 : 명확히하기 : Exit1에서 ImportedTable이 지워지지 않습니다.

+0

pr_INTRANET_ClearData가 오류 코드를 반환합니까? 나는 @@ Error가 이런 호출로 작동하지 않을 것이라고 생각한다. @Error를 선언하고 exec @ Error = pr_INTRANET_ClearData @StoreCode, @UserId를 설정하십시오. pr_INTRANET_ClearData가 프로 시저에서 @@ Error 또는 사용자 정의 오류 코드를 반환하는지 확인하십시오. 그 절차가했던 것에서 끊어 질 수 있습니다. –

답변

6

SET XACT_ABORT ON 오류가 발생하면 명시 적으로 롤백 할 필요가 없으므로 트랜잭션을 롤백하는 데 오류가 발생합니다. BEGIN TRY/BEGIN CATCH를 사용하는 것도 고려해야합니다. 프로그램 할 때마다 @@ ERROR를 확인하는 것보다 훨씬 쉽습니다.

+0

SQL2000 및 SQL2005에서 작동합니까? – vikasde

+0

SET XACT_ABORT는 둘 다에서 작동합니다. Try/Catch는 SQL2005 이상에서만 사용할 수 있습니다. – MartW

+0

굉장 팁. 감사! – vikasde