检查时间表是否存在

时间:2017-03-02 14:26:01

标签: sql-server azure-sql-database

我已经创建了一个可调温的表,如何用脚本验证它已被添加。所以我正在尝试创建一个脚本,如果尚未创建临时表,则创建它。 if不起作用

IF (OBJECT_ID('[dbo].[CarHistory]') IS NULL) 
BEGIN
Print 'Add Temporal table to Car table'

Alter table Car 
ADD SysStartTime DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN DEFAULT GETUTCDATE(),
SysEndTime  DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN DEFAULT CONVERT(DATETIME2, '9999-12-31 23:59:59.9999999'),
             PERIOD FOR SYSTEM_TIME (StartTime, EndTime)

ALTER TABLE dbo.Car SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE=dbo.CarHistory));

END

但是我得到了这个错误 Msg 13597,Level 16,State 2,Line 16 时间SYSTEM_TIME时间段已经在表'dbo.Car'上定义,因为我已经添加了它。

2 个答案:

答案 0 :(得分:4)

最简单的方法是sys.tables中的temporal_type列。

以下是总值

temporal_type列:

0 = NON_TEMPORAL_TABLE
1 = HISTORY_TABLE
2 = SYSTEM_VERSIONED_TEMPORAL_TABLE

您可以使用以下内容:

IF EXISTS (SELECT * FROM sys.table WHERE name = 'Car' AND temporal_type = 2)
BEGIN
        ...
END

答案 1 :(得分:1)

要使表成为临时表,需要添加2个单独的步骤,添加时间段,然后为表设置versioning = on。 Jovan的答案检查表是否为临时表,但不检查时间段是否与表相关联。的确,如果表是临时表,它将具有时间段,但是如果不是临时表,则它可能仍具有时间段。

还请记住,如果在if语句中执行此操作,则即使由于if语句而无法执行句点,该语句的准备也将尝试添加句点失败,因此您需要创建一个动态sql 。这将检查表是否有句点,并在需要时添加它(假设您已经添加并设置了SysStartTime,SysEndTime列的值),然后还检查表是否为Temporal,如果不是,则将其设为Temporal。

--check to see if the time period is added to this table already, and add if needed.
IF NOT EXISTS (select * from sys.periods where object_id = OBJECT_ID('dbo.TableName'))
begin
    --add time period for table
    EXEC sp_executesql 'ALTER TABLE [dbo].[TableName] ADD PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime)';
END 
    
    
--see if this table is not already temporal, if not make it so
IF EXISTS (SELECT temporal_type
        FROM   sys.tables
        WHERE  object_id = OBJECT_ID('[dbo].[TableName]', 'u') 
        AND temporal_type = 0)
BEGIN           
    --turn versioning on
    ALTER TABLE [dbo].[TableName] SET(SYSTEM_VERSIONING = ON (HISTORY_TABLE = [data].[TableName_Hist], DATA_CONSISTENCY_CHECK = OFF));
END