私は知識のためだけにこの質問をしています。SQL Server 2008 R2があり、異なるテーブルに対して1つずつ実行する5つの挿入ステートメントがあるストアドプロシージャを作成しました。
そのストアドプロシージャにロックやトランザクションコードを配置していません。では、3番目の挿入ステートメントがエラーをスローした場合はどうなりますか?残りの2つのステートメントは実行されますか?
ありがとう
私は知識のためだけにこの質問をしています。SQL Server 2008 R2があり、異なるテーブルに対して1つずつ実行する5つの挿入ステートメントがあるストアドプロシージャを作成しました。
そのストアドプロシージャにロックやトランザクションコードを配置していません。では、3番目の挿入ステートメントがエラーをスローした場合はどうなりますか?残りの2つのステートメントは実行されますか?
ありがとう
エラーの種類に基づいて、SQLServerはステートメントまたはバッチを中止します。ステートメントを中止しても、他の挿入は引き続き実行されます。バッチを中止すると、プロシージャは中止され、残りの挿入は実行されません。
MartinSmithによるコメントからのSommarskogによる優れた記事の完全な詳細。
設定例を次に示します。TestProc
これには、 6つの挿入を行うストアドプロシージャが含まれています。3番目の挿入は外部キー違反を引き起こし、5番目の挿入は変換エラーを引き起こします。2番目のエラーのみが、ストアドプロシージャを停止させます。
use test
GO
set nocount on
IF OBJECT_ID(N't2', N'U') IS NOT NULL
DROP TABLE t2;
IF OBJECT_ID(N't1', N'U') IS NOT NULL
DROP TABLE t1;
IF OBJECT_ID(N'TestProc', N'P') IS NOT NULL
DROP procedure TestProc
GO
CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY);
CREATE TABLE t2 (a INT NOT NULL REFERENCES t1(a));
GO
create procedure TestProc
as
INSERT INTO t1 VALUES (1);
INSERT INTO t1 VALUES (2);
INSERT INTO t2 VALUES (3); -- Foreign key error (statement abort)
INSERT INTO t2 VALUES (1); -- Still gets inserted
INSERT INTO t2 VALUES ('a'); -- Conversion failed (batch abort)
INSERT INTO t2 VALUES (2); -- Does *not* get inserted
go
exec TestProc
go
select * from dbo.t1
select * from dbo.t2
出力:
Msg 547, Level 16, State 0, Procedure TestProc, Line 6
The INSERT statement conflicted with the FOREIGN KEY constraint "FK__t2__a__035179CE".
The conflict occurred in database "test", table "dbo.t1", column 'a'.
The statement has been terminated.
Msg 245, Level 16, State 1, Procedure TestProc, Line 8
Conversion failed when converting the varchar value 'a' to data type int.
a
-----------
1
2
a
-----------
1