0

我有一个数据仓库程序,可以将数十个表从链接服务器下载并替换到本地数据库。每隔一段时间,代码就会卡在链接服务器上的一个表上,因为链接服务器上的表处于转换状态。我的假设是,由于整个过程被认为是一个事务提交,所以当过程卡住时,到目前为止,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
4

2 回答 2

2

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

于 2012-10-02T13:51:06.330 回答
0

简而言之:存储过程!=事务。SQL Server 不会为存储过程创建单独的事务。您应该自己管理交易。请看这个链接:http: //blog.sqlauthority.com/2010/06/02/sql-server-stored-procedure-and-transactions/

于 2012-09-14T16:52:48.280 回答