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 TABLEwith 也ADD PERIOD始终会导致执行错误。IFfalse
您需要像这样的 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 次 |
| 最近记录: |