【问题标题】:Check if Temporal Table Exisits检查临时表是否存在
【发布时间】:2017-03-02 14:26:00
【问题描述】:

我已经创建了一个临时表,我如何使用脚本验证它已被添加。因此,我正在尝试创建一个脚本,以创建尚未创建的临时表。 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

但是我得到了这个错误 消息 13597,第 16 层,状态 2,第 16 行 临时 SYSTEM_TIME 时间段已在表 'dbo.Car' 上定义,因为我已经添加了它。

【问题讨论】:

标签: sql-server azure-sql-database


【解决方案1】:

要使表成为临时表,需要执行 2 项单独的操作,即添加时间段,并为表设置版本控制 = on。 Jovan 的答案检查表是否是临时的,但不检查周期是否与表相关联。确实,如果表是 Temporal,它会有时间段,但如果它不是 Temporal,它可能仍然有时间段。

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

--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

【讨论】:

    【解决方案2】:

    最简单的方法是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
    

    【讨论】:

      猜你喜欢
      • 2011-12-30
      • 2011-09-25
      • 2013-06-18
      • 2010-10-14
      • 1970-01-01
      • 2012-06-28
      • 2013-05-27
      • 2011-09-14
      • 1970-01-01
      相关资源
      最近更新 更多