Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 server SQL Server中大型事务回滚中的数据状态_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

Sql server SQL Server中大型事务回滚中的数据状态

Sql server SQL Server中大型事务回滚中的数据状态,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,我有一个数据仓库过程,可以从链接服务器下载并替换数十个表到本地数据库。每隔一段时间,代码就会卡在链接服务器上的一个表上,因为链接服务器上的表处于转换状态。我的假设是,由于整个过程被视为一个事务提交,因此当该过程被卡住时,procudure迄今所做的任何更改都不会提交。但事实似乎恰恰相反,在程序卡住之前“下载”的表将在本地服务器上更新为今天的版本。SQL Server是否应该等待整个过程完成,然后更改才能持久 CREATE PROCEDURE MYIMPORT AS BEGIN SET N

我有一个数据仓库过程,可以从链接服务器下载并替换数十个表到本地数据库。每隔一段时间,代码就会卡在链接服务器上的一个表上,因为链接服务器上的表处于转换状态。我的假设是,由于整个过程被视为一个事务提交,因此当该过程被卡住时,procudure迄今所做的任何更改都不会提交。但事实似乎恰恰相反,在程序卡住之前“下载”的表将在本地服务器上更新为今天的版本。SQL Server是否应该等待整个过程完成,然后更改才能持久

CREATE PROCEDURE MYIMPORT

AS

BEGIN


SET NOCOUNT ON

IF EXISTS (SELECT * FROM INFORMATION.SCHEMA.TABLES WHERE TABLE_NAME = 'TABLE1')
DROP TABLE TABLE1

SELECT COLUMN1, COLUMN2, COLUMN3 
INTO TABLE1
FROM OPENQUERY(MYLINK, 'SELECT COLUMN1, COLUMN2, COLUMN3 FROM TABLE1')

IF EXISTS (SELECT * FROM INFORMATION.SCHEMA.TABLES WHERE TABLE_NAME = 'TABLE2')
DROP TABLE TABLE2

SELECT COLUMN1, COLUMN2, COLUMN3 
INTO TABLE2
FROM OPENQUERY(MYLINK, 'SELECT COLUMN1, COLUMN2, COLUMN3 FROM TABLE2')
--IF THE PROCEDURE GETS STUCK HERE, THEN CHANGES TO TABLE1 WOULD HAVE BEEN MADE ON THE LOCAL SERVER WHILE NO CHANGES WOULD HAVE BEEN MADE TO TABLE3 ON THE LOCAL SERVER

IF EXISTS (SELECT * FROM INFORMATION.SCHEMA.TABLES WHERE TABLE_NAME = 'TABLE3')
DROP TABLE TABLE3

SELECT COLUMN1, COLUMN2, COLUMN3 
INTO TABLE3
FROM OPENQUERY(MYLINK, 'SELECT COLUMN1, COLUMN2, COLUMN3 FROM TABLE3')


END

简而言之:存储过程!=交易SQL Server不会为存储过程创建单独的事务。你应该自己管理交易。请参阅此链接:

SQL Server将过程中的每个语句视为单独的事务。需要添加“BEGIN TRANSACTION”和“COMMIT TRANSACTION”以将事务分组为一个事务。

我在存储过程中没有看到任何
BEGIN TRAN
。。。