Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL过程中的超时_Sql_Tsql_Stored Procedures - Fatal编程技术网

SQL过程中的超时

SQL过程中的超时,sql,tsql,stored-procedures,Sql,Tsql,Stored Procedures,我正在使用下面的sql从内部网的文件中导入一些数据。然而,每隔一段时间,就会有一个超时错误,进程就会失败,这就是我使用事务的原因。如果事务失败,我希望清除ImportedTable。然而,这似乎没有发生。这里有我遗漏的东西吗 ALTER PROCEDURE [dbo].[pr_ImportData] @StoreCode varchar(10), @UserId varchar(100) AS BEGIN TRANSACTION -- 1) Clear the data exec pr

我正在使用下面的sql从内部网的文件中导入一些数据。然而,每隔一段时间,就会有一个超时错误,进程就会失败,这就是我使用事务的原因。如果事务失败,我希望清除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
更新1:我正在对SQL2000和SQL2005运行此功能


更新2:澄清:ImportedTable永远不会在Exit1时被清除。

将在回滚事务时出错,从而消除在出错时显式回滚的需要。您还应该考虑使用开始尝试/开始捕获,这比在每个语句之后检查@ @错误程序要容易得多。

会有任何错误来回滚事务,消除了在出现错误时需要显式回滚的必要性。您还应该考虑使用开始尝试/开始捕获,这比在每个语句之后检查@ @错误程序要容易得多。

是否PRR.InTruttSeCuffDATA返回错误代码?我认为@错误对这样的调用不起作用。尝试声明@Error,然后设置exec@Error=pr\u INTRANET\u ClearData@StoreCode、@UserId。确保pr_INTRANET_ClearData从过程中返回@错误或自定义错误代码。它可能会挂断该过程所做的一切。pr_INTRANET_ClearData是否返回错误代码?我认为@错误对这样的调用不起作用。尝试声明@Error,然后设置exec@Error=pr\u INTRANET\u ClearData@StoreCode、@UserId。确保pr_INTRANET_ClearData从过程中返回@错误或自定义错误代码。它可能会挂断该过程所做的一切。SET XACT_ABORT将在这两种情况下都起作用。Try/Catch仅适用于SQL2005和up。SET XACT_ABORT将在这两种情况下工作。Try/Catch仅适用于SQL2005及以上版本。