J'utilise le sql ci-dessous pour importer des données d'un fichier de l'intranet. Cependant, de temps en temps, il y aura une erreur de timeout et le processus échouera, c'est pourquoi j'utilise une transaction. Si la transaction échoue, je veux que ImportedTable soit effacé. Cependant, cela ne semble pas arriver. Y a-t-il quelque chose qui me manque ici?Timeout dans SQL Procédure
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
Mise à jour 1: Je suis en cours d'exécution contre ce SQL 2000 et SQL2005.
Mise à jour 2: Pour clarifier: ImportedTable n'est jamais effacé à Exit1.
Est-ce que pr_INTRANET_ClearData renvoie un code d'erreur? Je ne pense pas que l'erreur @@ fonctionnera avec un appel comme celui-ci. Essayez de déclarer un @Error, puis de définir exec @Error = pr_INTRANET_ClearData @StoreCode, @UserId. Assurez-vous que le pr_INTRANET_ClearData renvoie l'erreur @@ ou un code d'erreur personnalisé de la procédure. Il pourrait raccrocher à partir de ce que cette procédure fait. –