2013-02-18 26 views
1

對於這個表T-SQL錯誤嚴重性會影響腳本是否繼續執行下一條語句?

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] 

當我運行對搶先表下面的代碼,第一次插入成功,但因爲代碼試圖插入的標識列的重複值,第二個將失敗。

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 

Msg 2627, Level 14, State 1, Line 13
Violation of PRIMARY KEY constraint 'PK_Table_2'. Cannot insert duplicate key in object 'dbo.Table_2'.

Insert 3 

(1 row(s) affected) 

而不是在那裏遇到了錯誤的位置腳本一流的執行,繼續執行下一個插入語句,該語句成功。

我意識到,我可以用一個try catch塊時,會發生,但我的問題是捕獲錯誤:

我注意到錯誤的嚴重性是14.我認爲足夠嚴重的錯誤級別會導致執行中止。你能告訴我,如果這是corerct和什麼最低嚴重程度需要導致腳本中止?

+0

[沒有這麼簡單(http://www.sommarskog.se/error-handling-I.html#whathappens) – 2013-02-18 17:15:26

+1

20的最低嚴重會導致您的客戶端連接終止,以及停止當時的劇本。如果您想在某個時候結束腳本,則使用SQLCMD功能會更加輕鬆。 – muhmud 2013-02-18 17:17:55

回答

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 
相關問題