2017-11-06 3 views
1

エラーがトランザクションを中止すると仮定しましたが、そうではありません。テーブルt2が下のコードで作成されるのはなぜですか?エラーが発生したときにSQL Serverトランザクションが続行するのはなぜですか?

IF OBJECT_ID('dbo.t1', 'U') IS NOT NULL 
    DROP TABLE dbo.t1 

IF OBJECT_ID('dbo.t2', 'U') IS NOT NULL 
    DROP TABLE dbo.t2 
GO 

SELECT 
    OBJECT_ID(N't1', N'U') AS t1_Exists, 
    OBJECT_ID(N't2', N'U') AS t2_Exists 
GO 

BEGIN TRANSACTION 

CREATE TABLE t1 (id INT) 
GO 
CREATE TABLE t1 (id INT)--Causes an error, since t1 already exists 
GO 
CREATE TABLE t2 (id INT) 
GO 

COMMIT TRANSACTION 
GO 

SELECT 
    OBJECT_ID(N't1', N'U') AS t1_Exists, 
    OBJECT_ID(N't2', N'U') AS t2_Exists 

実行後、テーブルt2が存在します。既にデータベースにT1 '' という名前のオブジェクトはあり

t1_Exists t2_Exists 
----------- ----------- 
NULL  NULL 

メッセージ2714、レベル16、状態6、行1
:ここに出力されます。

メッセージ3902、レベル16、状態1、行2
COMMIT TRANSACTION要求には、対応するBEGIN TRANSACTIONがありません。

t1_Exists t2_Exists 
----------- ----------- 
NULL  370984223 

答えて

2

あなたは、トランザクション全体がロールバックされるようにするためにGO文削除する必要があります。あなたがそれぞれの間に、あなたのコード内の「ゴー」文の各文を置くとき

IF OBJECT_ID('dbo.t1', 'U') IS NOT NULL 
DROP TABLE dbo.t1 
IF OBJECT_ID('dbo.t2', 'U') IS NOT NULL 
DROP TABLE dbo.t2 
GO 

SELECT OBJECT_ID(N't1', N'U') AS t1_Exists, OBJECT_ID(N't2', N'U') AS t2_Exists 
GO 



BEGIN TRANSACTION 

CREATE TABLE t1 (id INT) 


CREATE TABLE t1 (id INT)--Causes an error, since t1 already exists 


CREATE TABLE t2 (id INT) 

COMMIT TRANSACTION 



GO 

SELECT OBJECT_ID(N't1', N'U') AS t1_Exists, OBJECT_ID(N't2', N'U') AS t2_Exist 
0

をGoはバッチとみなされ、同じファイル内にあっても別々に実行されます。したがって、これを避けるには、BeginとCommit Transactionの間にあるすべてのgo文を削除する必要があります。あなたがコミットする前に。より安全にするために、セッションにアクティブなトランザクションがあるかどうかを確認してください。このように

IF OBJECT_ID('dbo.t1', 'U') IS NOT NULL 
DROP TABLE dbo.t1 
IF OBJECT_ID('dbo.t2', 'U') IS NOT NULL 
DROP TABLE dbo.t2 
GO 

SELECT OBJECT_ID(N't1', N'U') AS t1_Exists, OBJECT_ID(N't2', N'U') AS t2_Exists 
GO 



BEGIN TRANSACTION 

CREATE TABLE t1 (id INT) 


CREATE TABLE t1 (id INT)--Causes an error, since t1 already exists 


CREATE TABLE t2 (id INT) 

IF @@TRANCOUNT>0  
COMMIT TRANSACTION 



GO 

SELECT OBJECT_ID(N't1', N'U') AS t1_Exists, OBJECT_ID(N't2', N'U') AS t2_Exist 
関連する問題