带有时态表

时间:2017-03-04 20:47:19

标签: tsql sql-server-2016 temporal-tables

我的理解是,不可能设置基表具有基于UDF的计算列的时态表。但是,我已经看到它表明,如果您遵循特定的过程,这应该是可能的: Computed Columns In Azure SQL Server 2016 Temporal Tables

建议的步骤是

  • 首先关闭系统版本控制
  • 然后将计算列添加到基表
  • 验证"类型"得到的计算列
  • 将具有相应静态类型的列添加到历史记录表
  • 重新启用系统版本控制

可能此解决方案仅适用于Azure。我已经使用具有类型为datetime但未成功的UDF计算列的表使用SQL Standard进行了尝试。有没有人能够让这个工作,如果可以的话,请分享一个简单的TSQL示例。

TNX

2 个答案:

答案 0 :(得分:0)

这是可行的,但UDF必须是架构绑定。

有一个例子:

CREATE FUNCTION [dbo].[VitalyUTCtoDate] (@UTCDate DATETIME2)
RETURNS DATETIME2 WITH SCHEMABINDING AS  
BEGIN 
    RETURN CASE WHEN @UTCDate < '9999-01-01' THEN DATEADD(HOUR, DATEDIFF(HOUR, GETUTCDATE(), GETDATE()), @UTCDate) ELSE NULL END;
END
GO

CREATE TABLE [dbo].[VitalyTest](
     [ID] [bigint] IDENTITY(1,1) NOT NULL 
    ,[Name] NVARCHAR(255) NOT NULL
    ,[Value] INT NULL
    ,[ValidFrom] DATETIME2 (2) GENERATED ALWAYS AS ROW START HIDDEN 
    ,[ValidTo] DATETIME2 (2) GENERATED ALWAYS AS ROW END HIDDEN

    ,[WhenCreated] AS dbo.VitalyUTCtoDate(ValidFrom)

    ,CONSTRAINT [PK_VitalyTest] PRIMARY KEY CLUSTERED ([ID] ASC)
        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ,PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = [dbo].[VitalyTestHistory]))
GO

答案 1 :(得分:-1)

Azure和非Azure环境也是如此。

您必须在同一个数据库上创建功能 - &gt; tempdb。在tempdb上创建你的函数,它会工作。但它将在重新启动SQL Server时处理。具有功能的计算列受数据库模型的限制。

您提到的解决方案适用于row versioning feathure的表格。但功能相同的规则。

示例:

    -- have to use tempdb
    use tempdb
    go

    -- UDF
    create function [dbo].ReturnSeven() 
    returns int
    with schemabinding
    begin
        return 7
    end

    -- table
    if object_id('tempdb..#TmpSevenTable') is not null drop table #TmpSevenTable
    create table #TmpSevenTable (
        pk int not null unique, 
        seven as dbo.ReturnSeven() persisted, 
        mpl_seven as pk * dbo.ReturnSeven() persisted)

    insert into #TmpSevenTable (pk) select 1
    insert into #TmpSevenTable (pk) select 3

    -- look at computed columns
    select * from #TmpSevenTable