当我执行此脚本时,尽管第二INSERT
由于对Fluffiness的NOT NULL约束而失败,但第一个INSERT
仍然有效。为什么第一行仍然存在,为什么不回滚?
BEGIN TRAN
INSERT INTO tCat(Cat, Fluffiness) VALUES('Sir Pounce A Lot', 8.0)
INSERT INTO tCat(Cat) VALUES('Violet')
COMMIT
这是表格脚本
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[tCat]
(
[CatID] [INT] IDENTITY(1,1) NOT NULL,
[Cat] [NCHAR](100) NOT NULL,
[CatBreedID] [INT] NULL,
[Fluffiness] [FLOAT] NOT NULL,
CONSTRAINT [PK_tCat]
PRIMARY KEY CLUSTERED ([CatID] ASC)
) ON [PRIMARY]
答案 0 :(得分:6)
您需要使用SET XACT_ABORT ON
:
SET XACT_ABORT ON;
BEGIN TRAN
INSERT INTO tCat(Cat, Fluffiness) VALUES('Sir Pounce A Lot', 8.0)
INSERT INTO tCat(Cat) VALUES('Violet')
COMMIT
相关文章:Error Handling in SQL by Erland Sommarskog
此表列出了一些常见错误,以及它们是中止当前语句还是整个批处理。
+---------------------+-----------+ | Error | Aborts | +---------------------+-----------+ | NOT NULL violation. | Statement | +---------------------+-----------+
到目前为止,我所说的内容适用于XACT_ABORT为OFF(默认设置)的情况。 当您将SET XACT_ABORT ON发出时,大多数语句终止错误会变成批中止错误