当前连接 SQL 时态表

Sha*_*awn 3 sql sql-server temporal-tables

我正在尝试执行以下操作:

SELECT report.*,
doc.*
FROM report
FOR system_time ALL report
JOIN Document
FOR system_time as of <<report.BeginDate>> doc ON report.DocumentId = doc.DocumentId
Run Code Online (Sandbox Code Playgroud)

基本上我想获取父表的所有历史记录,以及根据父行在正确时间关联的子表。这可能吗?

Cha*_*ace 6

不幸的是,FOR SYSTEM_TIME只允许文字或变量/参数。它不能是查询中的列。但是您可以将其放入内联表值函数中,然后放入APPLY该函数:

CREATE OR ALTER FUNCTION dbo.DocumentAsOfDate (@documentId int, @asOfDate datetime(7))
RETURNS TABLE
AS RETURN
SELECT d.*
FROM dbo.Document FOR SYSTEM_TIME AS OF @asOfDate AS d
WHERE d.DocumentId = @documentId;

GO
Run Code Online (Sandbox Code Playgroud)
SELECT
  report.*,
  doc.*
FROM report FOR SYSTEM_TIME ALL report
CROSS APPLY dbo.DocumentAsOfDate (report.DocumentId, report.BeginDate) doc;
Run Code Online (Sandbox Code Playgroud)

您可能需要考虑使用哪个日期(开始或结束),以及是否使用FOR SYSTEM_TIME BETWEEN...或其他过滤器。