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.