0

リンク サーバーからローカル データベースに数十のテーブルをダウンロードして置き換えるデータ ウェアハウジング手順があります。リンク サーバー上のテーブルが遷移状態にあるため、リンク サーバー上のテーブルの 1 つにコードがスタックすることがあります。プロシージャ全体が 1 つのトランザクション コミットと見なされるため、プロシージャがスタックした場合、プロシージャによってこれまでに行われた変更はコミットされていないと思います。しかし、逆の場合は、手順が行き詰まる前に「ダウンロード」されたテーブルは、ローカル サーバー上の現在のバージョンで更新されているはずです。変更が持続する前に、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は、プロシージャ内の各ステートメントを個別のトランザクションとして扱います。トランザクションを1つにグループ化するには、「BEGINTRANSACTION」と「COMMITTRANSACTION」を追加する必要があります。

于 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 に答える