Pat*_*ele 4 sql-server azure-sql-database
我正在尝试有条件地执行一个ALTER TABLE
命令(准确地说是这个)。但是,我无法将其ADD PERIOD
设为有条件的,我怀疑这可能是一个错误。
如果PERIOD
表中已经存在,这是我尝试跳过执行的内容。所有这些都会引发相同的错误:
消息 13597,级别 16,状态 2,第 xx 行
临时 SYSTEM_TIME 时间段已在表 'msdb.dbo.sysjobhistory' 上定义。
仅在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)
这引发了错误。
由于上述方法不起作用,我想确保我的IF
语句正确评估,所以我尝试了:
if 1=2
ALTER TABLE [dbo].[sysjobhistory]
ADD PERIOD FOR SYSTEM_TIME (StartTime, EndTime)
Run Code Online (Sandbox Code Playgroud)
但这也引发了错误。
使用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
仍然引发的错误。
承认失败并将其包装在 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 TABLE
with 也ADD PERIOD
始终会导致执行错误。IF
false
您需要像这样的 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)
归档时间: |
|
查看次数: |
289 次 |
最近记录: |