Delen via


Procedure: Query's uitvoeren met tijdreizen op instructieniveau

In Microsoft Fabric ontgrendelt de mogelijkheid tot tijdreizen de mogelijkheid om query's uit te voeren op de eerdere versies van gegevens zonder dat er meerdere gegevenskopieën hoeven te worden gegenereerd, wat bespaart op de opslagkosten. In dit artikel wordt beschreven hoe u query's uitvoert op magazijntabellen met behulp van tijdreizen op instructieniveau, met behulp van de T-SQL OPTION-component en de AS OF SYNTAXIS VOOR TIJDSTEMPEL . Deze functie is momenteel beschikbaar in preview.

Magazijntabellen kunnen worden opgevraagd tot een bewaarperiode van dertig kalenderdagen met behulp van de OPTION component, op basis van de datumnotatie yyyy-MM-ddTHH:mm:ss[.fff].

De volgende voorbeelden kunnen worden uitgevoerd in de SQL-Power Query-editor, SQL Server Management Studio (SSMS), Azure Data Studio of een T-SQL-queryeditor.

Notitie

Momenteel wordt alleen de UTC-tijdzone (Coordinated Universal Time) gebruikt voor tijdreizen.

Tijdreizen op een magazijntabel

In dit voorbeeld ziet u hoe u tijd kunt reizen op een afzonderlijke tabel in het magazijn.

De OPTION T-SQL-component geeft het tijdstip aan om de gegevens te retourneren.

/* Time travel using a SELECT statement */
SELECT *
FROM [dbo].[dimension_customer]
OPTION (FOR TIMESTAMP AS OF '2024-05-02T20:44:13.700');

Tijdreizen op meerdere magazijntabellen

De OPTION-component wordt eenmaal per query gedeclareerd en de resultaten van de query weerspiegelen de status van de gegevens op de tijdstempel die is opgegeven in de query voor alle tabellen.

SELECT Sales.StockItemKey, 
Sales.Description, 
CAST (Sales.Quantity AS int)) AS SoldQuantity, 
c.Customer
FROM [dbo].[fact_sale] AS Sales INNER JOIN [dbo].[dimension_customer] AS c
ON Sales.CustomerKey = c.CustomerKey
GROUP BY Sales.StockItemKey, Sales.Description, Sales.Quantity, c.Customer
ORDER BY Sales.StockItemKey
OPTION (FOR TIMESTAMP AS OF '2024-05-02T20:44:13.700');

Tijdreizen in een opgeslagen procedure

Opgeslagen procedures zijn een set SQL-instructies die vooraf zijn gecompileerd en opgeslagen, zodat deze herhaaldelijk kunnen worden gebruikt. De OPTION-component kan eenmaal worden gedeclareerd in de opgeslagen procedure en de resultatenset weerspiegelt de status van alle tabellen in de opgegeven tijdstempel.

De FOR TIMESTAMP AS OF component kan geen variabele rechtstreeks accepteren, omdat waarden in deze OPTION component deterministisch moeten zijn. U kunt sp_executesql gebruiken om een sterk getypte datum/tijd-waarde door te geven aan de opgeslagen procedure. In dit eenvoudige voorbeeld wordt een variabele doorgegeven en wordt de parameter datum/tijd geconverteerd naar de benodigde notatie met datumstijl 126.

CREATE PROCEDURE [dbo].[sales_by_city] (@pointInTime DATETIME)
AS
BEGIN
DECLARE @selectForTimestampStatement NVARCHAR(4000);
DECLARE @pointInTimeLiteral VARCHAR(33);

SET @pointInTimeLiteral = CONVERT(VARCHAR(33), @pointInTime, 126);
SET @selectForTimestampStatement = '
SELECT *
    FROM [dbo].[fact_sale] 
    OPTION (FOR TIMESTAMP AS OF ''' + @pointInTimeLiteral + ''')';
 
    EXEC sp_executesql @selectForTimestampStatement
END

Vervolgens kunt u de opgeslagen procedure aanroepen en een variabele doorgeven als een sterk getypte parameter. Voorbeeld:

--Execute the stored procedure
DECLARE @pointInTime DATETIME;
SET @pointInTime = '2024-05-10T22:56:15.457';
EXEC dbo.sales_by_city @pointInTime;

Of bijvoorbeeld:

--Execute the stored procedure
DECLARE @pointInTime DATETIME;
SET @pointInTime = DATEADD(dd, -7, GETDATE())
EXEC dbo.sales_by_city @pointInTime;

Tijdreizen in een weergave

Weergaven vertegenwoordigen een opgeslagen query die gegevens dynamisch ophaalt uit een of meer tabellen wanneer de weergave wordt opgevraagd. De OPTION-component kan worden gebruikt om een query uit te voeren op de weergaven, zodat de resultaten de status van de gegevens weerspiegelen op de tijdstempel die is opgegeven in de query.

--Create View
CREATE VIEW Top10CustomersView
AS
SELECT TOP (10) 
    FS.[CustomerKey], 
    DC.[Customer], 
    SUM(FS.TotalIncludingTax) AS TotalSalesAmount
FROM 
    [dbo].[dimension_customer] AS DC
INNER JOIN 
    [dbo].[fact_sale] AS FS ON DC.[CustomerKey] = FS.[CustomerKey]
GROUP BY 
    FS.[CustomerKey], 
    DC.[Customer]
ORDER BY 
    TotalSalesAmount DESC;

/*View of Top10 Customers as of a point in time*/
SELECT *
FROM [Timetravel].[dbo].[Top10CustomersView]
OPTION (FOR TIMESTAMP AS OF '2024-05-01T21:55:27.513'); 
  • De historische gegevens uit tabellen in een weergave kunnen alleen worden opgevraagd voor tijdreizen vanaf het moment dat de weergave is gemaakt.
  • Nadat een weergave is gewijzigd, zijn tijdreisquery's alleen geldig nadat deze zijn gewijzigd.
  • Als een onderliggende tabel van een weergave wordt gewijzigd zonder de weergave te wijzigen, kunnen query's voor tijdreizen in de weergave de gegevens retourneren van vóór de tabelwijziging, zoals verwacht.
  • Wanneer de onderliggende tabel van een weergave wordt verwijderd en opnieuw wordt gemaakt zonder de weergave te wijzigen, zijn gegevens voor query's voor tijdreizen alleen beschikbaar vanaf het moment dat de tabel opnieuw is gemaakt.

Beperkingen

Zie Beperkingen voor tijdreizen voor meer informatie over tijdreizen op instructieniveau met FOR TIMESTAMP AS OFbeperkingen voor tijdreizen.