Sql server SQL Server try catch不处理创建、更改表和添加PK约束

Sql server SQL Server try catch不处理创建、更改表和添加PK约束,sql-server,tsql,Sql Server,Tsql,这是正常的还是我遗漏了什么?这些语句不会产生回滚 BEGIN TRAN BEGIN TRY CREATE TABLE dbo."aCTIONS" ("ID" int NOT NULL IDENTITY(1,1) ) ALTER TABLE "dbo"."aCTIONS" ADD "Date" datetime ALTER TABLE "dbo"."aCTIONS" ADD "Name" nvarchar(50) COLLATE L

这是正常的还是我遗漏了什么?这些语句不会产生回滚

BEGIN TRAN
BEGIN TRY
    CREATE TABLE dbo."aCTIONS" ("ID" int  NOT NULL IDENTITY(1,1) )

    ALTER TABLE "dbo"."aCTIONS" 
        ADD "Date" datetime

    ALTER TABLE "dbo"."aCTIONS" 
        ADD "Name" nvarchar(50) COLLATE Latin1_General_CI_AS

    ALTER TABLE "dbo"."aCTIONS" 
        ADD "ActionID" int;

    ALTER TABLE "dbo"."aCTIONS" 
        ADD CONSTRAINT PK_aCTIONS_ActionID 
            PRIMARY KEY NONCLUSTERED ("ActionID") 

    ALTER TABLE "dbo"."aCTIONS" 
        ADD "Notes" nvarchar(255) COLLATE Latin1_General_CI_AS;

    ALTER TABLE "dbo"."aCTIONS" 
        ADD CONSTRAINT DF_aCTIONS_Notes DEFAULT (N'MISLIM') FOR "Notes"

    ALTER TABLE "dbo"."aCTIONS" 
        ADD "Consequence_Paid" bit;

    ALTER TABLE "dbo"."aCTIONS" 
        ADD CONSTRAINT DF_aCTIONS_Consequence_Paid DEFAULT ((1)) FOR "Consequence_Paid"

    ALTER TABLE "dbo"."aCTIONS" 
        ADD "Reward_Paid" bit

    ALTER TABLE "dbo"."aCTIONS" 
        ADD "username" int

    ALTER TABLE "dbo"."aCTIONS" 
        ADD "time" time(0)

    ALTER TABLE "dbo"."aCTIONS" 
        ADD "DateOnly" date;

    ALTER TABLE "dbo"."aCTIONS" 
        ADD CONSTRAINT DF_aCTIONS_DateOnly DEFAULT (getdate()) FOR "DateOnly"
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRAN
END CATCH
IF @@TRANCOUNT > 0
    COMMIT TRAN
请注意,在…添加“ActionID”int之后有一个大空格,不应该有NULL,然后下一个语句将尝试在其上创建PK约束。所以这里会发生错误,这没关系。但不知何故,我得到了SSMS中显示的错误,在回滚之前,事务保持活动状态,但如何呢?为什么?

请注意,这只是我正在构建的脚本过程的一个输出,并试图确保若存在错误,将永远不会部分创建表

谢谢, 德扬

编辑1

好的,好的,但是这个动物呢,它是由SSMS本身产生的:

/* Toprevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
ALTER TABLE dbo.Stavke ADD
    dsad nchar(10) NULL
GO
ALTER TABLE dbo.Stavke SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
?


必须有比这更重要的东西,最后我正在寻找解决方案,如何将其全部放在事务中。

有一个解决方案:

更多信息:

这让我想到了这个解决方案:

SET XACT_ABORT ON; 

BEGIN TRAN
BEGIN TRY
    CREATE TABLE dbo."aCTIONS" ("ID" int  NOT NULL IDENTITY(1,1) )

    ALTER TABLE "dbo"."aCTIONS" 
        ADD "Date" datetime

    ALTER TABLE "dbo"."aCTIONS" 
        ADD "Name" nvarchar(50) COLLATE Latin1_General_CI_AS

    ALTER TABLE "dbo"."aCTIONS" 
        ADD "ActionID" int;

    ALTER TABLE "dbo"."aCTIONS" 
        ADD CONSTRAINT PK_aCTIONS_ActionID 
            PRIMARY KEY NONCLUSTERED ("ActionID") 

    ALTER TABLE "dbo"."aCTIONS" 
        ADD "Notes" nvarchar(255) COLLATE Latin1_General_CI_AS;

    ALTER TABLE "dbo"."aCTIONS" 
        ADD CONSTRAINT DF_aCTIONS_Notes DEFAULT (N'MISLIM') FOR "Notes"

    ALTER TABLE "dbo"."aCTIONS" 
        ADD "Consequence_Paid" bit;

    ALTER TABLE "dbo"."aCTIONS" 
        ADD CONSTRAINT DF_aCTIONS_Consequence_Paid DEFAULT ((1)) FOR "Consequence_Paid"

    ALTER TABLE "dbo"."aCTIONS" 
        ADD "Reward_Paid" bit

    ALTER TABLE "dbo"."aCTIONS" 
        ADD "username" int

    ALTER TABLE "dbo"."aCTIONS" 
        ADD "time" time(0)

    ALTER TABLE "dbo"."aCTIONS" 
        ADD "DateOnly" date;

    ALTER TABLE "dbo"."aCTIONS" 
        ADD CONSTRAINT DF_aCTIONS_DateOnly DEFAULT (getdate()) FOR "DateOnly"
END TRY
BEGIN CATCH
    IF (XACT_STATE()) = -1  
    BEGIN
        ROLLBACK TRAN
        THROW
    END
END CATCH
IF (XACT_STATE()) = 1  
    COMMIT TRAN

由于错误,无法创建该表。很酷,不是吗?

这肯定已经得到了回答。它没有捕获它,因为TRY/catch用于捕获t-sql语句。您拥有的是ddl语句。它们是完全不同的动物。这里有几只。。。。和