无法停止“ADD PERIOD”的执行

Pat*_*ele 4 sql-server azure-sql-database

我正在尝试有条件地执行一个ALTER TABLE命令(准确地说是这个)。但是,我无法将其ADD PERIOD设为有条件的,我怀疑这可能是一个错误。

如果PERIOD表中已经存在,这是我尝试跳过执行的内容。所有这些都会引发相同的错误:

消息 13597,级别 16,状态 2,第 xx 行

临时 SYSTEM_TIME 时间段已在表 'msdb.dbo.sysjobhistory' 上定义。

  1. 仅在PERIOD当前不存在时添加:

    if not exists(select 1 from sys.periods where object_id = OBJECT_ID('sysjobhistory'))
        ALTER TABLE [dbo].[sysjobhistory]
        ADD PERIOD FOR SYSTEM_TIME (StartTime, EndTime)
    
    Run Code Online (Sandbox Code Playgroud)

    这引发了错误。

  2. 由于上述方法不起作用,我想确保我的IF语句正确评估,所以我尝试了:

    if 1=2
        ALTER TABLE [dbo].[sysjobhistory]
        ADD PERIOD FOR SYSTEM_TIME (StartTime, EndTime)
    
    Run Code Online (Sandbox Code Playgroud)

    但这也引发了错误。

  3. 使用SET NOEXEC ON的代码停止执行

    set noexec ON
        ALTER TABLE [dbo].[sysjobhistory]
        ADD PERIOD FOR SYSTEM_TIME (StartTime, EndTime)
    set noexec OFF
    
    Run Code Online (Sandbox Code Playgroud)

    没用。在ALTER TABLE仍然引发的错误。

  4. 承认失败并将其包装在 a 中,TRY/CATCH然后忽略错误:

    begin try
        ALTER TABLE [dbo].[sysjobhistory]
        ADD PERIOD FOR SYSTEM_TIME (StartTime, EndTime)
    end try
    begin catch
    end catch
    
    Run Code Online (Sandbox Code Playgroud)

    这也引发了错误——这是我没想到的,因为它是 16 级,并且根据文档,16 级应该进入该CATCH块。

这是 Azure SQL Server 中的错误吗?这是在托管实例上运行的。该@@VERSION报告:

Microsoft SQL Azure (RTM) - 12.0.2000.8 2018 年 11 月 2 日 21:17:06 版权所有 (C) 2018 Microsoft Corporation

更新

我可以使用类似的技术跳过添加已经存在的列而没有任何问题:

if not exists(select 1 from sys.columns where name = 'StartTime' and object_id = OBJECT_ID('sysjobhistory'))
    ALTER TABLE [dbo].[sysjobhistory]
    ADD StartTime DATETIME2 NOT NULL DEFAULT ('19000101 00:00:00.0000000')
GO
Run Code Online (Sandbox Code Playgroud)

上面的代码仅在sysjobhistory不包含列的情况下执行StartTime。如果它已经这样做了,代码什么都不做并继续执行。即使代码位于计算结果为的条件内,ALTER TABLEwith 也ADD PERIOD始终会导致执行错误。IFfalse

Eri*_*ing 5

您需要像这样的 DDL 动态 SQL。

IF NOT EXISTS(SELECT 1 FROM sys.periods WHERE object_id = OBJECT_ID('sysjobhistory'))
    DECLARE @sql NVARCHAR(MAX) = N''
    SET @sql += N'
    ALTER TABLE dbo.sysjobhistory
    ADD PERIOD FOR SYSTEM_TIME (StartTime, EndTime);'

    EXEC sys.sp_executesql @sql
Run Code Online (Sandbox Code Playgroud)