2013-01-25 79 views
0

我只是在問這個問題的知識。我有SQL Server 2008 R2,並且我創建了一個存儲過程,其中有五個插入語句針對不同的表逐個執行。存儲過程中的多個insert語句給出錯誤

我沒有在該存儲過程中放置​​任何鎖或事務代碼。現在如果第三個insert語句拋出一個錯誤呢?剩下的兩個陳述是否會被執行?

謝謝

回答

1

根據錯誤類型,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 
+0

+1這取決於錯誤的性質。有些(如違反約束)會中止該聲明。其他正在批量中止。 [更多詳情](http://www.sommarskog.se/error-handling-I.html#whathappens) –

+0

如果在面試中被問到了什麼問題,我很困惑? :) – Dev

+1

回答「它取決於」,並舉例說明如何在違反約束後繼續執行,並在數字轉換錯誤後停止執行。 – Andomar

相關問題