我的理解是,不可能设置基表具有基于UDF的计算列的时态表。但是,我已经看到它表明,如果您遵循特定的过程,这应该是可能的: Computed Columns In Azure SQL Server 2016 Temporal Tables
建议的步骤是
可能此解决方案仅适用于Azure。我已经使用具有类型为datetime但未成功的UDF计算列的表使用SQL Standard进行了尝试。有没有人能够让这个工作,如果可以的话,请分享一个简单的TSQL示例。
TNX
答案 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