0
我只是在問這個問題的知識。我有SQL Server 2008 R2,並且我創建了一個存儲過程,其中有五個插入語句針對不同的表逐個執行。存儲過程中的多個insert語句給出錯誤
我沒有在該存儲過程中放置任何鎖或事務代碼。現在如果第三個insert語句拋出一個錯誤呢?剩下的兩個陳述是否會被執行?
謝謝
我只是在問這個問題的知識。我有SQL Server 2008 R2,並且我創建了一個存儲過程,其中有五個插入語句針對不同的表逐個執行。存儲過程中的多個insert語句給出錯誤
我沒有在該存儲過程中放置任何鎖或事務代碼。現在如果第三個insert語句拋出一個錯誤呢?剩下的兩個陳述是否會被執行?
謝謝
根據錯誤類型,SQL Server將中止語句或批處理。如果它中止語句,其他插入仍然會運行。如果它中止批處理,該過程將中止並且其餘插入不運行。
全部細節在an excellent article by Sommarskog由Martin Smith發表評論。
下面是一個示例設置。它包含一個存儲過程TestProc
,它執行六個插入。第三次插入會導致外鍵違例,第五次插入會導致轉換錯誤。只有第二個錯誤會導致存儲過程停止:
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
+1這取決於錯誤的性質。有些(如違反約束)會中止該聲明。其他正在批量中止。 [更多詳情](http://www.sommarskog.se/error-handling-I.html#whathappens) –
如果在面試中被問到了什麼問題,我很困惑? :) – Dev
回答「它取決於」,並舉例說明如何在違反約束後繼續執行,並在數字轉換錯誤後停止執行。 – Andomar