视图中的时态表语法

zu1*_*u1b 2 sql-server temporal-tables

考虑以下情况。我有一个系统版本的表“测试”。我还有一个表,其中包含我上次检查该表中已修改行的时间。

CREATE TABLE [Delta]
(
    Tablename NVARCHAR(50) NOT NULL,
    Proccess UNIQUEIDENTIFIER NOT NULL,
    LastDelta DATETIME2 NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

我现在想创建一个执行此查询的视图

Fake syntax
SELECT * 
FROM [test]
FOR SYSTEM_TIME AS OF (select LastDelta from Delta where TableName = 'Test')
Run Code Online (Sandbox Code Playgroud)

提供日期时间的唯一选项是固定值或参数吗?参数对视图没有用处,固定值也无济于事。

我可以用我自己的查询模拟“for system_time as of”的效果,但我想知道是否有一种我错过的方法,如“假语法”或类似的所示。

小智 5

使用表值函数 (TVF)。

CREATE FUNCTION dbo.TVF_func (@_timestamp DATETIME2)
RETURNS TABLE AS
RETURN
SELECT T.*
  FROM [tests]
  FOR SYSTEM_TIME AS OF @_timestamp T;
Run Code Online (Sandbox Code Playgroud)

然后可以在任何可以使用视图的地方使用 TVF。

SELECT * 
  FROM dbo.TVF_func('2020-10-31') T 
  JOIN [etc...]
Run Code Online (Sandbox Code Playgroud)

对于具有复杂逻辑的视图,您通常会根据日期变量选择输出的子集,通过将视图重写为 TVF 而不是SELECT * FROM view V WHERE V.date = @date.