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]

当我对空表运行以下代码时,第一个插入成功,但第二个插入将失败,因为代码正在尝试为标识列插入重复值。

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 行
违反主键约束“PK_Table_2”。无法在对象“dbo.Table_2”中插入重复键。

Insert 3

(1 row(s) affected)

不是在遇到错误的地方执行脚本,而是继续执行下一个插入语句,该语句成功。

我意识到我可以在错误发生时使用 TRY CATCH 块来捕获错误,但我的问题是:

我注意到错误的严重性为 14。我假设严重级别足够的错误会导致执行中止。你能告诉我这是否是 corerct 以及导致脚本中止需要什么最低严重性级别?

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 回答