1

この表を考えると

CREATE TABLE [dbo].[Table_2](
    [X] [int] IDENTITY(1,1) NOT NULL,
    [Y] [varchar](30) NULL,
 CONSTRAINT [PK_Table_2] PRIMARY KEY CLUSTERED 
(
    [X] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

空のテーブルに対して次のコードを実行すると、最初の挿入は成功しますが、コードが ID 列に重複する値を挿入しようとしているため、2 番目の挿入は失敗します。

BEGIN

    SET IDENTITY_INSERT Table_2 ON

    PRINT 'Insert 1'

    INSERT INTO Table_2
                (X, Y)
    VALUES      (3, CAST(getdate() AS varchar(30)) )

    PRINT 'Insert 2'

    INSERT INTO Table_2
                (X, Y)
    VALUES      (3, CAST(getdate() AS varchar(30)) )

    PRINT 'Insert 3'

    INSERT INTO Table_2
                (X, Y)
    VALUES      (4, CAST(getdate() AS varchar(30)) )

    SET IDENTITY_INSERT Table_2 OFF    

END 

出力:

Insert 1

(1 row(s) affected)
Insert 2

メッセージ 2627、レベル 14、状態 1、行 13
PRIMARY KEY 制約 'PK_Table_2' の違反。オブジェクト 'dbo.Table_2' に重複するキーを挿入できません。

Insert 3

(1 row(s) affected)

エラーが発生した時点で実行をトッピングするスクリプトの代わりに、実行は次の挿入ステートメントで続行され、成功します。

エラーが発生したときにTRY CATCHブロックを使用してエラーをキャッチできることはわかっていますが、私の質問は次のとおりです。

エラーの重大度が 14 であることに気付きました。十分な重大度レベルのエラーが発生すると、実行が中止されると思います。これが正しいかどうか、およびスクリプトを中止させるために必要な最小重大度レベルを教えてください。

4

1 に答える 1

2

SET オプションを使用して、エラー時にトランザクションの実行を停止できます。

SET XACT_ABORT ON

http://msdn.microsoft.com/en-us/library/ms188792.aspx

ただし、オール オア ナッシングの動作を実現するには、コードをトランザクションでラップする必要があります。

SET XACT_ABORT ON
BEGIN  TRAN

SET IDENTITY_INSERT Table_2 ON

PRINT 'Insert 1'

INSERT INTO Table_2
            (X, Y)
VALUES      (3, CAST(getdate() AS varchar(30)) )

PRINT 'Insert 2'

INSERT INTO Table_2
            (X, Y)
VALUES      (3, CAST(getdate() AS varchar(30)) )

PRINT 'Insert 3'

INSERT INTO Table_2
            (X, Y)
VALUES      (4, CAST(getdate() AS varchar(30)) )

SET IDENTITY_INSERT Table_2 OFF    

COMMIT
SET XACT_ABORT OFF
于 2013-02-18T17:20:20.427 に答える